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

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2 /* Copyright (C) 2015-2018 Netronome Systems, Inc. */
64 * how different BPF modes use app-specific counters
191 nsp = nfp_nsp_open(app->cpp); in nfp_net_get_nspinfo()
208 strscpy(drvinfo->driver, dev_driver_string(&pdev->dev), in nfp_get_drvinfo()
209 sizeof(drvinfo->driver)); in nfp_get_drvinfo()
211 snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), in nfp_get_drvinfo()
223 nn->fw_ver.extend, nn->fw_ver.class, in nfp_net_get_drvinfo()
224 nn->fw_ver.major, nn->fw_ver.minor); in nfp_net_get_drvinfo()
225 strscpy(drvinfo->bus_info, pci_name(nn->pdev), in nfp_net_get_drvinfo()
226 sizeof(drvinfo->bus_info)); in nfp_net_get_drvinfo()
228 nfp_get_drvinfo(nn->app, nn->pdev, vnic_version, drvinfo); in nfp_net_get_drvinfo()
241 return -EOPNOTSUPP; in nfp_net_nway_reset()
246 err = nfp_eth_set_configured(port->app->cpp, eth_port->index, false); in nfp_net_nway_reset()
252 err = nfp_eth_set_configured(port->app->cpp, eth_port->index, true); in nfp_net_nway_reset()
267 strscpy(drvinfo->bus_info, pci_name(app->pdev), in nfp_app_get_drvinfo()
268 sizeof(drvinfo->bus_info)); in nfp_app_get_drvinfo()
269 nfp_get_drvinfo(app, app->pdev, "*", drvinfo); in nfp_app_get_drvinfo()
280 ethtool_link_ksettings_add_link_mode(c, advertising, FEC_NONE); in nfp_net_set_fec_link_mode()
287 ethtool_link_ksettings_add_link_mode(c, advertising, FEC_BASER); in nfp_net_set_fec_link_mode()
292 ethtool_link_ksettings_add_link_mode(c, advertising, FEC_RS); in nfp_net_set_fec_link_mode()
439 bitmap_zero(port->speed_bitmap, NFP_SUP_SPEED_NUMBER); in nfp_add_media_link_mode()
443 if (eth_port->link_modes_supp[0] & BIT_ULL(i)) { in nfp_add_media_link_mode()
445 cmd->link_modes.supported); in nfp_add_media_link_mode()
447 port->speed_bitmap); in nfp_add_media_link_mode()
450 if (eth_port->link_modes_ad[0] & BIT_ULL(i)) in nfp_add_media_link_mode()
452 cmd->link_modes.advertising); in nfp_add_media_link_mode()
454 if (eth_port->link_modes_supp[1] & BIT_ULL(i - 64)) { in nfp_add_media_link_mode()
456 cmd->link_modes.supported); in nfp_add_media_link_mode()
458 port->speed_bitmap); in nfp_add_media_link_mode()
461 if (eth_port->link_modes_ad[1] & BIT_ULL(i - 64)) in nfp_add_media_link_mode()
463 cmd->link_modes.advertising); in nfp_add_media_link_mode()
472 if (bitmap_empty(port->speed_bitmap, NFP_SUP_SPEED_NUMBER)) in nfp_add_media_link_mode()
473 bitmap_fill(port->speed_bitmap, NFP_SUP_SPEED_NUMBER); in nfp_add_media_link_mode()
477 * nfp_net_get_link_ksettings - Get Link Speed settings
495 ethtool_link_ksettings_zero_link_mode(cmd, advertising); in nfp_net_get_link_ksettings()
497 cmd->base.port = PORT_OTHER; in nfp_net_get_link_ksettings()
498 cmd->base.speed = SPEED_UNKNOWN; in nfp_net_get_link_ksettings()
499 cmd->base.duplex = DUPLEX_UNKNOWN; in nfp_net_get_link_ksettings()
505 ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause); in nfp_net_get_link_ksettings()
507 if (eth_port->supp_aneg) { in nfp_net_get_link_ksettings()
509 if (eth_port->aneg == NFP_ANEG_AUTO) { in nfp_net_get_link_ksettings()
510 ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg); in nfp_net_get_link_ksettings()
511 cmd->base.autoneg = AUTONEG_ENABLE; in nfp_net_get_link_ksettings()
522 cmd->base.port = eth_port->port_type; in nfp_net_get_link_ksettings()
523 cmd->base.speed = eth_port->speed; in nfp_net_get_link_ksettings()
524 cmd->base.duplex = DUPLEX_FULL; in nfp_net_get_link_ksettings()
529 return -EOPNOTSUPP; in nfp_net_get_link_ksettings()
535 return -EOPNOTSUPP; in nfp_net_get_link_ksettings()
538 cmd->base.speed = speed; in nfp_net_get_link_ksettings()
539 cmd->base.duplex = DUPLEX_FULL; in nfp_net_get_link_ksettings()
549 bool req_aneg = (cmd->base.autoneg == AUTONEG_ENABLE); in nfp_net_set_link_ksettings()
558 return -EOPNOTSUPP; in nfp_net_set_link_ksettings()
562 return -EBUSY; in nfp_net_set_link_ksettings()
565 nsp = nfp_eth_config_start(port->app->cpp, eth_port->index); in nfp_net_set_link_ksettings()
569 if (req_aneg && !eth_port->supp_aneg) { in nfp_net_set_link_ksettings()
571 err = -EOPNOTSUPP; in nfp_net_set_link_ksettings()
579 if (cmd->base.speed != SPEED_UNKNOWN) { in nfp_net_set_link_ksettings()
580 u32 speed = cmd->base.speed / eth_port->lanes; in nfp_net_set_link_ksettings()
584 if (cmd->base.speed == nfp_eth_speed_map[i] && in nfp_net_set_link_ksettings()
585 test_bit(i, port->speed_bitmap)) { in nfp_net_set_link_ksettings()
593 cmd->base.speed); in nfp_net_set_link_ksettings()
594 err = -EINVAL; in nfp_net_set_link_ksettings()
600 err = -EINVAL; in nfp_net_set_link_ksettings()
628 u32 qc_max = nn->dev_info->max_qc_size; in nfp_net_get_ringparam()
630 ring->rx_max_pending = qc_max; in nfp_net_get_ringparam()
631 ring->tx_max_pending = qc_max / nn->dp.ops->tx_min_desc_per_pkt; in nfp_net_get_ringparam()
632 ring->rx_pending = nn->dp.rxd_cnt; in nfp_net_get_ringparam()
633 ring->tx_pending = nn->dp.txd_cnt; in nfp_net_get_ringparam()
643 return -ENOMEM; in nfp_net_set_ring_size()
645 dp->rxd_cnt = rxd_cnt; in nfp_net_set_ring_size()
646 dp->txd_cnt = txd_cnt; in nfp_net_set_ring_size()
660 if (ring->rx_mini_pending || ring->rx_jumbo_pending) in nfp_net_set_ringparam()
661 return -EOPNOTSUPP; in nfp_net_set_ringparam()
663 qc_min = nn->dev_info->min_qc_size; in nfp_net_set_ringparam()
664 qc_max = nn->dev_info->max_qc_size; in nfp_net_set_ringparam()
665 tx_dpp = nn->dp.ops->tx_min_desc_per_pkt; in nfp_net_set_ringparam()
667 rxd_cnt = roundup_pow_of_two(ring->rx_pending); in nfp_net_set_ringparam()
668 txd_cnt = roundup_pow_of_two(ring->tx_pending); in nfp_net_set_ringparam()
672 return -EINVAL; in nfp_net_set_ringparam()
677 return -EINVAL; in nfp_net_set_ringparam()
680 if (nn->dp.rxd_cnt == rxd_cnt && nn->dp.txd_cnt == txd_cnt) in nfp_net_set_ringparam()
683 nn_dbg(nn, "Change ring size: RxQ %u->%u, TxQ %u->%u\n", in nfp_net_set_ringparam()
684 nn->dp.rxd_cnt, rxd_cnt, nn->dp.txd_cnt, txd_cnt); in nfp_net_set_ringparam()
691 if (!netif_carrier_ok(netdev) || !(netdev->flags & IFF_UP)) in nfp_test_link()
704 nsp = nfp_nsp_open(app->cpp); in nfp_test_nsp()
712 err = -EOPNOTSUPP; in nfp_test_nsp()
718 err = -ENOMEM; in nfp_test_nsp()
748 struct nfp_cpp *cpp = app->cpp; in nfp_test_reg()
829 netdev_info(netdev, "Start self test\n"); in nfp_net_self_test()
835 eth_test->flags |= ETH_TEST_FL_FAILED; in nfp_net_self_test()
847 return NN_RVEC_GATHER_STATS + nn->max_r_vecs * NN_RVEC_PER_Q_STATS + in nfp_vnic_get_sw_stats_count()
856 for (i = 0; i < nn->max_r_vecs; i++) { in nfp_vnic_get_sw_stats_strings()
891 for (i = 0; i < nn->max_r_vecs; i++) { in nfp_vnic_get_sw_stats()
895 start = u64_stats_fetch_begin(&nn->r_vecs[i].rx_sync); in nfp_vnic_get_sw_stats()
896 data[0] = nn->r_vecs[i].rx_pkts; in nfp_vnic_get_sw_stats()
897 tmp[0] = nn->r_vecs[i].hw_csum_rx_ok; in nfp_vnic_get_sw_stats()
898 tmp[1] = nn->r_vecs[i].hw_csum_rx_inner_ok; in nfp_vnic_get_sw_stats()
899 tmp[2] = nn->r_vecs[i].hw_csum_rx_complete; in nfp_vnic_get_sw_stats()
900 tmp[3] = nn->r_vecs[i].hw_csum_rx_error; in nfp_vnic_get_sw_stats()
901 tmp[4] = nn->r_vecs[i].rx_replace_buf_alloc_fail; in nfp_vnic_get_sw_stats()
902 tmp[5] = nn->r_vecs[i].hw_tls_rx; in nfp_vnic_get_sw_stats()
903 } while (u64_stats_fetch_retry(&nn->r_vecs[i].rx_sync, start)); in nfp_vnic_get_sw_stats()
906 start = u64_stats_fetch_begin(&nn->r_vecs[i].tx_sync); in nfp_vnic_get_sw_stats()
907 data[1] = nn->r_vecs[i].tx_pkts; in nfp_vnic_get_sw_stats()
908 data[2] = nn->r_vecs[i].tx_busy; in nfp_vnic_get_sw_stats()
909 tmp[6] = nn->r_vecs[i].hw_csum_tx; in nfp_vnic_get_sw_stats()
910 tmp[7] = nn->r_vecs[i].hw_csum_tx_inner; in nfp_vnic_get_sw_stats()
911 tmp[8] = nn->r_vecs[i].tx_gather; in nfp_vnic_get_sw_stats()
912 tmp[9] = nn->r_vecs[i].tx_lso; in nfp_vnic_get_sw_stats()
913 tmp[10] = nn->r_vecs[i].hw_tls_tx; in nfp_vnic_get_sw_stats()
914 tmp[11] = nn->r_vecs[i].tls_tx_fallback; in nfp_vnic_get_sw_stats()
915 tmp[12] = nn->r_vecs[i].tls_tx_no_fallback; in nfp_vnic_get_sw_stats()
916 } while (u64_stats_fetch_retry(&nn->r_vecs[i].tx_sync, start)); in nfp_vnic_get_sw_stats()
927 *data++ = atomic_read(&nn->ktls_no_space); in nfp_vnic_get_sw_stats()
928 *data++ = atomic_read(&nn->ktls_rx_resync_req); in nfp_vnic_get_sw_stats()
929 *data++ = atomic_read(&nn->ktls_rx_resync_ign); in nfp_vnic_get_sw_stats()
930 *data++ = atomic_read(&nn->ktls_rx_resync_sent); in nfp_vnic_get_sw_stats()
956 ethtool_puts(&data, nfp_net_et_stats[i - swap_off].name); in nfp_vnic_get_hw_stats_strings()
991 return nn->tlv_caps.vnic_stats_cnt + nn->max_r_vecs * 4; in nfp_vnic_get_tlv_stats_count()
1000 mem = nn->dp.ctrl_bar + nn->tlv_caps.vnic_stats_off; in nfp_vnic_get_tlv_stats_strings()
1001 for (i = 0; i < nn->tlv_caps.vnic_stats_cnt; i++) { in nfp_vnic_get_tlv_stats_strings()
1017 for (i = 0; i < nn->max_r_vecs; i++) { in nfp_vnic_get_tlv_stats_strings()
1032 mem = nn->dp.ctrl_bar + nn->tlv_caps.vnic_stats_off; in nfp_vnic_get_tlv_stats()
1033 mem += roundup(2 * nn->tlv_caps.vnic_stats_cnt, 8); in nfp_vnic_get_tlv_stats()
1034 for (i = 0; i < nn->tlv_caps.vnic_stats_cnt; i++) in nfp_vnic_get_tlv_stats()
1037 mem = nn->dp.ctrl_bar; in nfp_vnic_get_tlv_stats()
1038 for (i = 0; i < nn->max_r_vecs; i++) { in nfp_vnic_get_tlv_stats()
1053 if (!__nfp_port_get_eth_port(port) || !port->eth_stats) in nfp_mac_get_stats_count()
1065 if (!__nfp_port_get_eth_port(port) || !port->eth_stats) in nfp_mac_get_stats_strings()
1080 if (!__nfp_port_get_eth_port(port) || !port->eth_stats) in nfp_mac_get_stats()
1084 *data++ = readq(port->eth_stats + nfp_mac_et_stats[i].off); in nfp_mac_get_stats()
1097 if (!nn->tlv_caps.vnic_stats_off) in nfp_net_get_strings()
1099 nn->max_r_vecs, in nfp_net_get_strings()
1104 data = nfp_app_port_get_stats_strings(nn->port, data); in nfp_net_get_strings()
1119 if (!nn->tlv_caps.vnic_stats_off) in nfp_net_get_stats()
1120 data = nfp_vnic_get_hw_stats(data, nn->dp.ctrl_bar, in nfp_net_get_stats()
1121 nn->max_r_vecs); in nfp_net_get_stats()
1125 data = nfp_app_port_get_stats(nn->port, data); in nfp_net_get_stats()
1136 if (!nn->tlv_caps.vnic_stats_off) in nfp_net_get_sset_count()
1137 cnt += nfp_vnic_get_hw_stats_count(nn->max_r_vecs); in nfp_net_get_sset_count()
1141 cnt += nfp_app_port_get_stats_count(nn->port); in nfp_net_get_sset_count()
1146 return -EOPNOTSUPP; in nfp_net_get_sset_count()
1176 data = nfp_vnic_get_hw_stats(data, port->vnic, 0); in nfp_port_get_stats()
1198 return -EOPNOTSUPP; in nfp_port_get_sset_count()
1215 return -EOPNOTSUPP; in nfp_port_fec_ethtool_to_nsp()
1242 param->active_fec = ETHTOOL_FEC_NONE; in nfp_port_get_fecparam()
1243 param->fec = ETHTOOL_FEC_NONE; in nfp_port_get_fecparam()
1248 return -EOPNOTSUPP; in nfp_port_get_fecparam()
1253 param->fec = nfp_port_fec_nsp_to_ethtool(eth_port->fec_modes_supported); in nfp_port_get_fecparam()
1254 param->active_fec = nfp_port_fec_nsp_to_ethtool(BIT(eth_port->act_fec)); in nfp_port_get_fecparam()
1270 return -EOPNOTSUPP; in nfp_port_set_fecparam()
1273 return -EOPNOTSUPP; in nfp_port_set_fecparam()
1275 fec = nfp_port_fec_ethtool_to_nsp(param->fec); in nfp_port_set_fecparam()
1279 err = nfp_eth_set_fec(port->app->cpp, eth_port->index, fec); in nfp_port_set_fecparam()
1311 cmd->data = 0; in nfp_net_get_rss_hash_opts()
1313 if (!(nn->cap & NFP_NET_CFG_CTRL_RSS_ANY)) in nfp_net_get_rss_hash_opts()
1314 return -EOPNOTSUPP; in nfp_net_get_rss_hash_opts()
1316 nfp_rss_flag = ethtool_flow_to_nfp_flag(cmd->flow_type); in nfp_net_get_rss_hash_opts()
1318 return -EINVAL; in nfp_net_get_rss_hash_opts()
1320 cmd->data |= RXH_IP_SRC | RXH_IP_DST; in nfp_net_get_rss_hash_opts()
1321 if (nn->rss_cfg & nfp_rss_flag) in nfp_net_get_rss_hash_opts()
1322 cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; in nfp_net_get_rss_hash_opts()
1331 struct ethtool_rx_flow_spec *fs = &cmd->fs; in nfp_net_fs_to_ethtool()
1334 switch (entry->flow_type & ~FLOW_RSS) { in nfp_net_fs_to_ethtool()
1338 fs->h_u.tcp_ip4_spec.ip4src = entry->key.sip4; in nfp_net_fs_to_ethtool()
1339 fs->h_u.tcp_ip4_spec.ip4dst = entry->key.dip4; in nfp_net_fs_to_ethtool()
1340 fs->h_u.tcp_ip4_spec.psrc = entry->key.sport; in nfp_net_fs_to_ethtool()
1341 fs->h_u.tcp_ip4_spec.pdst = entry->key.dport; in nfp_net_fs_to_ethtool()
1342 fs->m_u.tcp_ip4_spec.ip4src = entry->msk.sip4; in nfp_net_fs_to_ethtool()
1343 fs->m_u.tcp_ip4_spec.ip4dst = entry->msk.dip4; in nfp_net_fs_to_ethtool()
1344 fs->m_u.tcp_ip4_spec.psrc = entry->msk.sport; in nfp_net_fs_to_ethtool()
1345 fs->m_u.tcp_ip4_spec.pdst = entry->msk.dport; in nfp_net_fs_to_ethtool()
1351 fs->h_u.tcp_ip6_spec.ip6src[i] = entry->key.sip6[i]; in nfp_net_fs_to_ethtool()
1352 fs->h_u.tcp_ip6_spec.ip6dst[i] = entry->key.dip6[i]; in nfp_net_fs_to_ethtool()
1353 fs->m_u.tcp_ip6_spec.ip6src[i] = entry->msk.sip6[i]; in nfp_net_fs_to_ethtool()
1354 fs->m_u.tcp_ip6_spec.ip6dst[i] = entry->msk.dip6[i]; in nfp_net_fs_to_ethtool()
1356 fs->h_u.tcp_ip6_spec.psrc = entry->key.sport; in nfp_net_fs_to_ethtool()
1357 fs->h_u.tcp_ip6_spec.pdst = entry->key.dport; in nfp_net_fs_to_ethtool()
1358 fs->m_u.tcp_ip6_spec.psrc = entry->msk.sport; in nfp_net_fs_to_ethtool()
1359 fs->m_u.tcp_ip6_spec.pdst = entry->msk.dport; in nfp_net_fs_to_ethtool()
1362 fs->h_u.usr_ip4_spec.ip_ver = ETH_RX_NFC_IP4; in nfp_net_fs_to_ethtool()
1363 fs->h_u.usr_ip4_spec.ip4src = entry->key.sip4; in nfp_net_fs_to_ethtool()
1364 fs->h_u.usr_ip4_spec.ip4dst = entry->key.dip4; in nfp_net_fs_to_ethtool()
1365 fs->h_u.usr_ip4_spec.proto = entry->key.l4_proto; in nfp_net_fs_to_ethtool()
1366 fs->m_u.usr_ip4_spec.ip4src = entry->msk.sip4; in nfp_net_fs_to_ethtool()
1367 fs->m_u.usr_ip4_spec.ip4dst = entry->msk.dip4; in nfp_net_fs_to_ethtool()
1368 fs->m_u.usr_ip4_spec.proto = entry->msk.l4_proto; in nfp_net_fs_to_ethtool()
1372 fs->h_u.usr_ip6_spec.ip6src[i] = entry->key.sip6[i]; in nfp_net_fs_to_ethtool()
1373 fs->h_u.usr_ip6_spec.ip6dst[i] = entry->key.dip6[i]; in nfp_net_fs_to_ethtool()
1374 fs->m_u.usr_ip6_spec.ip6src[i] = entry->msk.sip6[i]; in nfp_net_fs_to_ethtool()
1375 fs->m_u.usr_ip6_spec.ip6dst[i] = entry->msk.dip6[i]; in nfp_net_fs_to_ethtool()
1377 fs->h_u.usr_ip6_spec.l4_proto = entry->key.l4_proto; in nfp_net_fs_to_ethtool()
1378 fs->m_u.usr_ip6_spec.l4_proto = entry->msk.l4_proto; in nfp_net_fs_to_ethtool()
1381 fs->h_u.ether_spec.h_proto = entry->key.l3_proto; in nfp_net_fs_to_ethtool()
1382 fs->m_u.ether_spec.h_proto = entry->msk.l3_proto; in nfp_net_fs_to_ethtool()
1385 return -EINVAL; in nfp_net_fs_to_ethtool()
1388 fs->flow_type = entry->flow_type; in nfp_net_fs_to_ethtool()
1389 fs->ring_cookie = entry->action; in nfp_net_fs_to_ethtool()
1391 if (fs->flow_type & FLOW_RSS) { in nfp_net_fs_to_ethtool()
1393 cmd->rss_context = 0; in nfp_net_fs_to_ethtool()
1395 fs->ring_cookie |= ETHTOOL_RX_FLOW_SPEC_RING; in nfp_net_fs_to_ethtool()
1405 if (!(nn->cap_w1 & NFP_NET_CFG_CTRL_FLOW_STEER)) in nfp_net_get_fs_rule()
1406 return -EOPNOTSUPP; in nfp_net_get_fs_rule()
1408 if (cmd->fs.location >= NFP_FS_MAX_ENTRY) in nfp_net_get_fs_rule()
1409 return -EINVAL; in nfp_net_get_fs_rule()
1411 list_for_each_entry(entry, &nn->fs.list, node) { in nfp_net_get_fs_rule()
1412 if (entry->loc == cmd->fs.location) in nfp_net_get_fs_rule()
1415 if (entry->loc > cmd->fs.location) in nfp_net_get_fs_rule()
1417 return -ENOENT; in nfp_net_get_fs_rule()
1420 return -ENOENT; in nfp_net_get_fs_rule()
1428 if (!(nn->cap_w1 & NFP_NET_CFG_CTRL_FLOW_STEER)) in nfp_net_get_fs_loc()
1429 return -EOPNOTSUPP; in nfp_net_get_fs_loc()
1431 list_for_each_entry(entry, &nn->fs.list, node) in nfp_net_get_fs_loc()
1432 rule_locs[count++] = entry->loc; in nfp_net_get_fs_loc()
1442 switch (cmd->cmd) { in nfp_net_get_rxnfc()
1444 cmd->data = nn->dp.num_rx_rings; in nfp_net_get_rxnfc()
1447 cmd->rule_cnt = nn->fs.count; in nfp_net_get_rxnfc()
1452 cmd->data = NFP_FS_MAX_ENTRY; in nfp_net_get_rxnfc()
1457 return -EOPNOTSUPP; in nfp_net_get_rxnfc()
1464 u32 new_rss_cfg = nn->rss_cfg; in nfp_net_set_rss_hash_opt()
1468 if (!(nn->cap & NFP_NET_CFG_CTRL_RSS_ANY)) in nfp_net_set_rss_hash_opt()
1469 return -EOPNOTSUPP; in nfp_net_set_rss_hash_opt()
1472 if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST | in nfp_net_set_rss_hash_opt()
1474 return -EINVAL; in nfp_net_set_rss_hash_opt()
1477 if (!(nfc->data & RXH_IP_SRC) || in nfp_net_set_rss_hash_opt()
1478 !(nfc->data & RXH_IP_DST)) in nfp_net_set_rss_hash_opt()
1479 return -EINVAL; in nfp_net_set_rss_hash_opt()
1481 nfp_rss_flag = ethtool_flow_to_nfp_flag(nfc->flow_type); in nfp_net_set_rss_hash_opt()
1483 return -EINVAL; in nfp_net_set_rss_hash_opt()
1485 switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { in nfp_net_set_rss_hash_opt()
1493 return -EINVAL; in nfp_net_set_rss_hash_opt()
1496 new_rss_cfg |= FIELD_PREP(NFP_NET_CFG_RSS_HFUNC, nn->rss_hfunc); in nfp_net_set_rss_hash_opt()
1499 if (new_rss_cfg == nn->rss_cfg) in nfp_net_set_rss_hash_opt()
1502 writel(new_rss_cfg, nn->dp.ctrl_bar + NFP_NET_CFG_RSS_CTRL); in nfp_net_set_rss_hash_opt()
1507 nn->rss_cfg = new_rss_cfg; in nfp_net_set_rss_hash_opt()
1509 nn_dbg(nn, "Changed RSS config to 0x%x\n", nn->rss_cfg); in nfp_net_set_rss_hash_opt()
1518 switch (fs->flow_type & ~FLOW_RSS) { in nfp_net_fs_from_ethtool()
1522 entry->msk.sip4 = fs->m_u.tcp_ip4_spec.ip4src; in nfp_net_fs_from_ethtool()
1523 entry->msk.dip4 = fs->m_u.tcp_ip4_spec.ip4dst; in nfp_net_fs_from_ethtool()
1524 entry->msk.sport = fs->m_u.tcp_ip4_spec.psrc; in nfp_net_fs_from_ethtool()
1525 entry->msk.dport = fs->m_u.tcp_ip4_spec.pdst; in nfp_net_fs_from_ethtool()
1526 entry->key.sip4 = fs->h_u.tcp_ip4_spec.ip4src & entry->msk.sip4; in nfp_net_fs_from_ethtool()
1527 entry->key.dip4 = fs->h_u.tcp_ip4_spec.ip4dst & entry->msk.dip4; in nfp_net_fs_from_ethtool()
1528 entry->key.sport = fs->h_u.tcp_ip4_spec.psrc & entry->msk.sport; in nfp_net_fs_from_ethtool()
1529 entry->key.dport = fs->h_u.tcp_ip4_spec.pdst & entry->msk.dport; in nfp_net_fs_from_ethtool()
1535 entry->msk.sip6[i] = fs->m_u.tcp_ip6_spec.ip6src[i]; in nfp_net_fs_from_ethtool()
1536 entry->msk.dip6[i] = fs->m_u.tcp_ip6_spec.ip6dst[i]; in nfp_net_fs_from_ethtool()
1537 entry->key.sip6[i] = fs->h_u.tcp_ip6_spec.ip6src[i] & entry->msk.sip6[i]; in nfp_net_fs_from_ethtool()
1538 entry->key.dip6[i] = fs->h_u.tcp_ip6_spec.ip6dst[i] & entry->msk.dip6[i]; in nfp_net_fs_from_ethtool()
1540 entry->msk.sport = fs->m_u.tcp_ip6_spec.psrc; in nfp_net_fs_from_ethtool()
1541 entry->msk.dport = fs->m_u.tcp_ip6_spec.pdst; in nfp_net_fs_from_ethtool()
1542 entry->key.sport = fs->h_u.tcp_ip6_spec.psrc & entry->msk.sport; in nfp_net_fs_from_ethtool()
1543 entry->key.dport = fs->h_u.tcp_ip6_spec.pdst & entry->msk.dport; in nfp_net_fs_from_ethtool()
1546 entry->msk.sip4 = fs->m_u.usr_ip4_spec.ip4src; in nfp_net_fs_from_ethtool()
1547 entry->msk.dip4 = fs->m_u.usr_ip4_spec.ip4dst; in nfp_net_fs_from_ethtool()
1548 entry->msk.l4_proto = fs->m_u.usr_ip4_spec.proto; in nfp_net_fs_from_ethtool()
1549 entry->key.sip4 = fs->h_u.usr_ip4_spec.ip4src & entry->msk.sip4; in nfp_net_fs_from_ethtool()
1550 entry->key.dip4 = fs->h_u.usr_ip4_spec.ip4dst & entry->msk.dip4; in nfp_net_fs_from_ethtool()
1551 entry->key.l4_proto = fs->h_u.usr_ip4_spec.proto & entry->msk.l4_proto; in nfp_net_fs_from_ethtool()
1555 entry->msk.sip6[i] = fs->m_u.usr_ip6_spec.ip6src[i]; in nfp_net_fs_from_ethtool()
1556 entry->msk.dip6[i] = fs->m_u.usr_ip6_spec.ip6dst[i]; in nfp_net_fs_from_ethtool()
1557 entry->key.sip6[i] = fs->h_u.usr_ip6_spec.ip6src[i] & entry->msk.sip6[i]; in nfp_net_fs_from_ethtool()
1558 entry->key.dip6[i] = fs->h_u.usr_ip6_spec.ip6dst[i] & entry->msk.dip6[i]; in nfp_net_fs_from_ethtool()
1560 entry->msk.l4_proto = fs->m_u.usr_ip6_spec.l4_proto; in nfp_net_fs_from_ethtool()
1561 entry->key.l4_proto = fs->h_u.usr_ip6_spec.l4_proto & entry->msk.l4_proto; in nfp_net_fs_from_ethtool()
1564 entry->msk.l3_proto = fs->m_u.ether_spec.h_proto; in nfp_net_fs_from_ethtool()
1565 entry->key.l3_proto = fs->h_u.ether_spec.h_proto & entry->msk.l3_proto; in nfp_net_fs_from_ethtool()
1568 return -EINVAL; in nfp_net_fs_from_ethtool()
1571 switch (fs->flow_type & ~FLOW_RSS) { in nfp_net_fs_from_ethtool()
1574 entry->key.l4_proto = IPPROTO_TCP; in nfp_net_fs_from_ethtool()
1575 entry->msk.l4_proto = 0xff; in nfp_net_fs_from_ethtool()
1579 entry->key.l4_proto = IPPROTO_UDP; in nfp_net_fs_from_ethtool()
1580 entry->msk.l4_proto = 0xff; in nfp_net_fs_from_ethtool()
1584 entry->key.l4_proto = IPPROTO_SCTP; in nfp_net_fs_from_ethtool()
1585 entry->msk.l4_proto = 0xff; in nfp_net_fs_from_ethtool()
1589 entry->flow_type = fs->flow_type; in nfp_net_fs_from_ethtool()
1590 entry->action = fs->ring_cookie; in nfp_net_fs_from_ethtool()
1591 entry->loc = fs->location; in nfp_net_fs_from_ethtool()
1600 list_for_each_entry(entry, &nn->fs.list, node) { in nfp_net_fs_check_existing()
1601 if (new->loc != entry->loc && in nfp_net_fs_check_existing()
1602 !((new->flow_type ^ entry->flow_type) & ~FLOW_RSS) && in nfp_net_fs_check_existing()
1603 !memcmp(&new->key, &entry->key, sizeof(new->key)) && in nfp_net_fs_check_existing()
1604 !memcmp(&new->msk, &entry->msk, sizeof(new->msk))) in nfp_net_fs_check_existing()
1605 return entry->loc; in nfp_net_fs_check_existing()
1608 /* -1 means no duplicates */ in nfp_net_fs_check_existing()
1609 return -1; in nfp_net_fs_check_existing()
1614 struct ethtool_rx_flow_spec *fs = &cmd->fs; in nfp_net_fs_add()
1619 if (!(nn->cap_w1 & NFP_NET_CFG_CTRL_FLOW_STEER)) in nfp_net_fs_add()
1620 return -EOPNOTSUPP; in nfp_net_fs_add()
1623 if ((fs->flow_type & FLOW_RSS) && cmd->rss_context) in nfp_net_fs_add()
1624 return -EOPNOTSUPP; in nfp_net_fs_add()
1626 if (fs->location >= NFP_FS_MAX_ENTRY) in nfp_net_fs_add()
1627 return -EINVAL; in nfp_net_fs_add()
1629 if (fs->ring_cookie != RX_CLS_FLOW_DISC && in nfp_net_fs_add()
1630 fs->ring_cookie >= nn->dp.num_rx_rings) in nfp_net_fs_add()
1631 return -EINVAL; in nfp_net_fs_add()
1634 switch (fs->flow_type & ~FLOW_RSS) { in nfp_net_fs_add()
1638 unsupp_mask = !!fs->m_u.tcp_ip4_spec.tos; in nfp_net_fs_add()
1643 unsupp_mask = !!fs->m_u.tcp_ip6_spec.tclass; in nfp_net_fs_add()
1646 unsupp_mask = !!fs->m_u.usr_ip4_spec.l4_4_bytes || in nfp_net_fs_add()
1647 !!fs->m_u.usr_ip4_spec.tos || in nfp_net_fs_add()
1648 !!fs->m_u.usr_ip4_spec.ip_ver; in nfp_net_fs_add()
1650 unsupp_mask |= fs->h_u.usr_ip4_spec.ip_ver != ETH_RX_NFC_IP4; in nfp_net_fs_add()
1653 unsupp_mask = !!fs->m_u.usr_ip6_spec.l4_4_bytes || in nfp_net_fs_add()
1654 !!fs->m_u.usr_ip6_spec.tclass; in nfp_net_fs_add()
1657 if (fs->h_u.ether_spec.h_proto == htons(ETH_P_IP) || in nfp_net_fs_add()
1658 fs->h_u.ether_spec.h_proto == htons(ETH_P_IPV6)) { in nfp_net_fs_add()
1660 return -EOPNOTSUPP; in nfp_net_fs_add()
1663 unsupp_mask = !is_zero_ether_addr(fs->m_u.ether_spec.h_dest) || in nfp_net_fs_add()
1664 !is_zero_ether_addr(fs->m_u.ether_spec.h_source) || in nfp_net_fs_add()
1665 (fs->m_u.ether_spec.h_proto != htons(0xffff)); in nfp_net_fs_add()
1668 return -EOPNOTSUPP; in nfp_net_fs_add()
1672 return -EOPNOTSUPP; in nfp_net_fs_add()
1676 return -ENOMEM; in nfp_net_fs_add()
1683 err = -EINVAL; in nfp_net_fs_add()
1688 list_for_each_entry(entry, &nn->fs.list, node) { in nfp_net_fs_add()
1689 if (entry->loc == fs->location) { in nfp_net_fs_add()
1694 nn->fs.count--; in nfp_net_fs_add()
1699 nn->fs.count++; in nfp_net_fs_add()
1700 list_replace(&entry->node, &new->node); in nfp_net_fs_add()
1706 if (entry->loc > fs->location) in nfp_net_fs_add()
1710 if (nn->fs.count == NFP_FS_MAX_ENTRY) { in nfp_net_fs_add()
1711 err = -ENOSPC; in nfp_net_fs_add()
1719 list_add_tail(&new->node, &entry->node); in nfp_net_fs_add()
1720 nn->fs.count++; in nfp_net_fs_add()
1734 if (!(nn->cap_w1 & NFP_NET_CFG_CTRL_FLOW_STEER)) in nfp_net_fs_del()
1735 return -EOPNOTSUPP; in nfp_net_fs_del()
1737 if (!nn->fs.count || cmd->fs.location >= NFP_FS_MAX_ENTRY) in nfp_net_fs_del()
1738 return -EINVAL; in nfp_net_fs_del()
1740 list_for_each_entry(entry, &nn->fs.list, node) { in nfp_net_fs_del()
1741 if (entry->loc == cmd->fs.location) { in nfp_net_fs_del()
1746 list_del(&entry->node); in nfp_net_fs_del()
1748 nn->fs.count--; in nfp_net_fs_del()
1751 } else if (entry->loc > cmd->fs.location) { in nfp_net_fs_del()
1757 return -ENOENT; in nfp_net_fs_del()
1765 switch (cmd->cmd) { in nfp_net_set_rxnfc()
1773 return -EOPNOTSUPP; in nfp_net_set_rxnfc()
1781 if (!(nn->cap & NFP_NET_CFG_CTRL_RSS_ANY)) in nfp_net_get_rxfh_indir_size()
1784 return ARRAY_SIZE(nn->rss_itbl); in nfp_net_get_rxfh_indir_size()
1791 if (!(nn->cap & NFP_NET_CFG_CTRL_RSS_ANY)) in nfp_net_get_rxfh_key_size()
1792 return -EOPNOTSUPP; in nfp_net_get_rxfh_key_size()
1803 if (!(nn->cap & NFP_NET_CFG_CTRL_RSS_ANY)) in nfp_net_get_rxfh()
1804 return -EOPNOTSUPP; in nfp_net_get_rxfh()
1806 if (rxfh->indir) in nfp_net_get_rxfh()
1807 for (i = 0; i < ARRAY_SIZE(nn->rss_itbl); i++) in nfp_net_get_rxfh()
1808 rxfh->indir[i] = nn->rss_itbl[i]; in nfp_net_get_rxfh()
1809 if (rxfh->key) in nfp_net_get_rxfh()
1810 memcpy(rxfh->key, nn->rss_key, nfp_net_rss_key_sz(nn)); in nfp_net_get_rxfh()
1812 rxfh->hfunc = nn->rss_hfunc; in nfp_net_get_rxfh()
1813 if (rxfh->hfunc >= 1 << ETH_RSS_HASH_FUNCS_COUNT) in nfp_net_get_rxfh()
1814 rxfh->hfunc = ETH_RSS_HASH_UNKNOWN; in nfp_net_get_rxfh()
1826 if (!(nn->cap & NFP_NET_CFG_CTRL_RSS_ANY) || in nfp_net_set_rxfh()
1827 !(rxfh->hfunc == ETH_RSS_HASH_NO_CHANGE || in nfp_net_set_rxfh()
1828 rxfh->hfunc == nn->rss_hfunc)) in nfp_net_set_rxfh()
1829 return -EOPNOTSUPP; in nfp_net_set_rxfh()
1831 if (!rxfh->key && !rxfh->indir) in nfp_net_set_rxfh()
1834 if (rxfh->key) { in nfp_net_set_rxfh()
1835 memcpy(nn->rss_key, rxfh->key, nfp_net_rss_key_sz(nn)); in nfp_net_set_rxfh()
1838 if (rxfh->indir) { in nfp_net_set_rxfh()
1839 for (i = 0; i < ARRAY_SIZE(nn->rss_itbl); i++) in nfp_net_set_rxfh()
1840 nn->rss_itbl[i] = rxfh->indir[i]; in nfp_net_set_rxfh()
1862 regs->version = nn_readl(nn, NFP_NET_CFG_VERSION); in nfp_net_get_regs()
1865 regs_buf[i] = readl(nn->dp.ctrl_bar + (i * sizeof(u32))); in nfp_net_get_regs()
1875 if (!(nn->cap & NFP_NET_CFG_CTRL_IRQMOD)) in nfp_net_get_coalesce()
1876 return -EOPNOTSUPP; in nfp_net_get_coalesce()
1878 ec->use_adaptive_rx_coalesce = nn->rx_coalesce_adapt_on; in nfp_net_get_coalesce()
1879 ec->use_adaptive_tx_coalesce = nn->tx_coalesce_adapt_on; in nfp_net_get_coalesce()
1881 ec->rx_coalesce_usecs = nn->rx_coalesce_usecs; in nfp_net_get_coalesce()
1882 ec->rx_max_coalesced_frames = nn->rx_coalesce_max_frames; in nfp_net_get_coalesce()
1883 ec->tx_coalesce_usecs = nn->tx_coalesce_usecs; in nfp_net_get_coalesce()
1884 ec->tx_max_coalesced_frames = nn->tx_coalesce_max_frames; in nfp_net_get_coalesce()
1898 return -EOPNOTSUPP; in nfp_dump_nsp_diag()
1900 dump->version = 1; in nfp_dump_nsp_diag()
1901 dump->flag = NFP_DUMP_NSP_DIAG; in nfp_dump_nsp_diag()
1903 res = nfp_resource_acquire(app->cpp, NFP_RESOURCE_NSP_DIAG); in nfp_dump_nsp_diag()
1908 if (dump->len != nfp_resource_size(res)) { in nfp_dump_nsp_diag()
1909 ret = -EINVAL; in nfp_dump_nsp_diag()
1913 ret = nfp_cpp_read(app->cpp, nfp_resource_cpp_id(res), in nfp_dump_nsp_diag()
1915 buffer, dump->len); in nfp_dump_nsp_diag()
1916 if (ret != dump->len) in nfp_dump_nsp_diag()
1917 ret = ret < 0 ? ret : -EIO; in nfp_dump_nsp_diag()
1921 dump->len = nfp_resource_size(res); in nfp_dump_nsp_diag()
1941 return -EOPNOTSUPP; in nfp_app_set_dump()
1943 if (val->flag == NFP_DUMP_NSP_DIAG) { in nfp_app_set_dump()
1944 app->pf->dump_flag = val->flag; in nfp_app_set_dump()
1948 if (!app->pf->dumpspec) in nfp_app_set_dump()
1949 return -EOPNOTSUPP; in nfp_app_set_dump()
1951 len = nfp_net_dump_calculate_size(app->pf, app->pf->dumpspec, in nfp_app_set_dump()
1952 val->flag); in nfp_app_set_dump()
1956 app->pf->dump_flag = val->flag; in nfp_app_set_dump()
1957 app->pf->dump_len = len; in nfp_app_set_dump()
1968 return -EOPNOTSUPP; in nfp_app_get_dump_flag()
1970 if (app->pf->dump_flag == NFP_DUMP_NSP_DIAG) in nfp_app_get_dump_flag()
1973 dump->flag = app->pf->dump_flag; in nfp_app_get_dump_flag()
1974 dump->len = app->pf->dump_len; in nfp_app_get_dump_flag()
1986 return -EOPNOTSUPP; in nfp_app_get_dump_data()
1988 if (app->pf->dump_flag == NFP_DUMP_NSP_DIAG) in nfp_app_get_dump_data()
1991 dump->flag = app->pf->dump_flag; in nfp_app_get_dump_data()
1992 dump->len = app->pf->dump_len; in nfp_app_get_dump_data()
1994 return nfp_net_dump_populate_buffer(app->pf, app->pf->dumpspec, dump, in nfp_app_get_dump_data()
2011 return -EOPNOTSUPP; in nfp_port_get_module_info()
2014 set_bit(NFP_PORT_CHANGED, &port->flags); in nfp_port_get_module_info()
2017 return -EOPNOTSUPP; in nfp_port_get_module_info()
2019 nsp = nfp_nsp_open(port->app->cpp); in nfp_port_get_module_info()
2028 err = -EOPNOTSUPP; in nfp_port_get_module_info()
2032 switch (eth_port->interface) { in nfp_port_get_module_info()
2035 err = nfp_nsp_read_module_eeprom(nsp, eth_port->eth_index, in nfp_port_get_module_info()
2042 modinfo->type = ETH_MODULE_SFF_8079; in nfp_port_get_module_info()
2043 modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; in nfp_port_get_module_info()
2045 modinfo->type = ETH_MODULE_SFF_8472; in nfp_port_get_module_info()
2046 modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; in nfp_port_get_module_info()
2050 err = nfp_nsp_read_module_eeprom(nsp, eth_port->eth_index, in nfp_port_get_module_info()
2057 modinfo->type = ETH_MODULE_SFF_8436; in nfp_port_get_module_info()
2058 modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN; in nfp_port_get_module_info()
2060 modinfo->type = ETH_MODULE_SFF_8636; in nfp_port_get_module_info()
2061 modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN; in nfp_port_get_module_info()
2065 modinfo->type = ETH_MODULE_SFF_8636; in nfp_port_get_module_info()
2066 modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN; in nfp_port_get_module_info()
2070 eth_port->interface); in nfp_port_get_module_info()
2071 err = -EINVAL; in nfp_port_get_module_info()
2091 return -EOPNOTSUPP; in nfp_port_get_module_eeprom()
2093 nsp = nfp_nsp_open(port->app->cpp); in nfp_port_get_module_eeprom()
2102 err = -EOPNOTSUPP; in nfp_port_get_module_eeprom()
2106 err = nfp_nsp_read_module_eeprom(nsp, eth_port->eth_index, in nfp_port_get_module_eeprom()
2107 eeprom->offset, data, eeprom->len, in nfp_port_get_module_eeprom()
2108 &eeprom->len); in nfp_port_get_module_eeprom()
2110 if (eeprom->len) { in nfp_port_get_module_eeprom()
2139 factor = nn->tlv_caps.me_freq_mhz / 16; in nfp_net_set_coalesce()
2154 if (!(nn->cap & NFP_NET_CFG_CTRL_IRQMOD)) in nfp_net_set_coalesce()
2155 return -EOPNOTSUPP; in nfp_net_set_coalesce()
2158 if (!ec->rx_coalesce_usecs && !ec->rx_max_coalesced_frames) { in nfp_net_set_coalesce()
2160 "rx-usecs and rx-frames cannot both be zero"); in nfp_net_set_coalesce()
2161 return -EINVAL; in nfp_net_set_coalesce()
2164 if (!ec->tx_coalesce_usecs && !ec->tx_max_coalesced_frames) { in nfp_net_set_coalesce()
2166 "tx-usecs and tx-frames cannot both be zero"); in nfp_net_set_coalesce()
2167 return -EINVAL; in nfp_net_set_coalesce()
2170 if (nfp_net_coalesce_para_check(ec->rx_coalesce_usecs * factor)) { in nfp_net_set_coalesce()
2171 NL_SET_ERR_MSG_MOD(extack, "rx-usecs too large"); in nfp_net_set_coalesce()
2172 return -EINVAL; in nfp_net_set_coalesce()
2175 if (nfp_net_coalesce_para_check(ec->rx_max_coalesced_frames)) { in nfp_net_set_coalesce()
2176 NL_SET_ERR_MSG_MOD(extack, "rx-frames too large"); in nfp_net_set_coalesce()
2177 return -EINVAL; in nfp_net_set_coalesce()
2180 if (nfp_net_coalesce_para_check(ec->tx_coalesce_usecs * factor)) { in nfp_net_set_coalesce()
2181 NL_SET_ERR_MSG_MOD(extack, "tx-usecs too large"); in nfp_net_set_coalesce()
2182 return -EINVAL; in nfp_net_set_coalesce()
2185 if (nfp_net_coalesce_para_check(ec->tx_max_coalesced_frames)) { in nfp_net_set_coalesce()
2186 NL_SET_ERR_MSG_MOD(extack, "tx-frames too large"); in nfp_net_set_coalesce()
2187 return -EINVAL; in nfp_net_set_coalesce()
2191 nn->rx_coalesce_adapt_on = !!ec->use_adaptive_rx_coalesce; in nfp_net_set_coalesce()
2192 nn->tx_coalesce_adapt_on = !!ec->use_adaptive_tx_coalesce; in nfp_net_set_coalesce()
2194 nn->rx_coalesce_usecs = ec->rx_coalesce_usecs; in nfp_net_set_coalesce()
2195 nn->rx_coalesce_max_frames = ec->rx_max_coalesced_frames; in nfp_net_set_coalesce()
2196 nn->tx_coalesce_usecs = ec->tx_coalesce_usecs; in nfp_net_set_coalesce()
2197 nn->tx_coalesce_max_frames = ec->tx_max_coalesced_frames; in nfp_net_set_coalesce()
2210 num_tx_rings = nn->dp.num_tx_rings; in nfp_net_get_channels()
2211 if (nn->dp.xdp_prog) in nfp_net_get_channels()
2212 num_tx_rings -= nn->dp.num_rx_rings; in nfp_net_get_channels()
2214 channel->max_rx = min(nn->max_rx_rings, nn->max_r_vecs); in nfp_net_get_channels()
2215 channel->max_tx = min(nn->max_tx_rings, nn->max_r_vecs); in nfp_net_get_channels()
2216 channel->max_combined = min(channel->max_rx, channel->max_tx); in nfp_net_get_channels()
2217 channel->max_other = NFP_NET_NON_Q_VECTORS; in nfp_net_get_channels()
2218 channel->combined_count = min(nn->dp.num_rx_rings, num_tx_rings); in nfp_net_get_channels()
2219 channel->rx_count = nn->dp.num_rx_rings - channel->combined_count; in nfp_net_get_channels()
2220 channel->tx_count = num_tx_rings - channel->combined_count; in nfp_net_get_channels()
2221 channel->other_count = NFP_NET_NON_Q_VECTORS; in nfp_net_get_channels()
2231 return -ENOMEM; in nfp_net_set_num_rings()
2233 dp->num_rx_rings = total_rx; in nfp_net_set_num_rings()
2234 dp->num_tx_rings = total_tx; in nfp_net_set_num_rings()
2235 /* nfp_net_check_config() will catch num_tx_rings > nn->max_tx_rings */ in nfp_net_set_num_rings()
2236 if (dp->xdp_prog) in nfp_net_set_num_rings()
2237 dp->num_tx_rings += total_rx; in nfp_net_set_num_rings()
2249 if (channel->other_count != NFP_NET_NON_Q_VECTORS || in nfp_net_set_channels()
2250 (channel->rx_count && channel->tx_count)) in nfp_net_set_channels()
2251 return -EINVAL; in nfp_net_set_channels()
2253 total_rx = channel->combined_count + channel->rx_count; in nfp_net_set_channels()
2254 total_tx = channel->combined_count + channel->tx_count; in nfp_net_set_channels()
2256 if (total_rx > min(nn->max_rx_rings, nn->max_r_vecs) || in nfp_net_set_channels()
2257 total_tx > min(nn->max_tx_rings, nn->max_r_vecs)) in nfp_net_set_channels()
2258 return -EINVAL; in nfp_net_set_channels()
2273 return -EOPNOTSUPP; in nfp_port_set_pauseparam()
2275 if (pause->autoneg != AUTONEG_DISABLE) in nfp_port_set_pauseparam()
2276 return -EOPNOTSUPP; in nfp_port_set_pauseparam()
2278 err = nfp_eth_set_pauseparam(port->app->cpp, eth_port->index, in nfp_port_set_pauseparam()
2279 pause->tx_pause, pause->rx_pause); in nfp_port_set_pauseparam()
2299 pause->autoneg = AUTONEG_DISABLE; in nfp_port_get_pauseparam()
2300 pause->rx_pause = eth_port->rx_pause; in nfp_port_get_pauseparam()
2301 pause->tx_pause = eth_port->tx_pause; in nfp_port_get_pauseparam()
2314 return -EOPNOTSUPP; in nfp_net_set_phys_id()
2319 err = nfp_eth_set_idmode(port->app->cpp, eth_port->index, 1); in nfp_net_set_phys_id()
2324 err = nfp_eth_set_idmode(port->app->cpp, eth_port->index, 0); in nfp_net_set_phys_id()
2330 return -EOPNOTSUPP; in nfp_net_set_phys_id()
2365 return -EOPNOTSUPP; in nfp_net_get_nsp_hwindex()
2367 nsp = nfp_nsp_open(port->app->cpp); in nfp_net_get_nsp_hwindex()
2377 return -EOPNOTSUPP; in nfp_net_get_nsp_hwindex()
2381 *index = eth_port->eth_index; in nfp_net_get_nsp_hwindex()
2405 return -EOPNOTSUPP; in nfp_net_get_port_mac_by_hwinfo()
2413 return -EOPNOTSUPP; in nfp_net_get_port_mac_by_hwinfo()
2442 return -EOPNOTSUPP; in nfp_net_set_port_mac_by_hwinfo()
2456 return -EOPNOTSUPP; in nfp_net_get_eeprom()
2458 if (eeprom->len == 0) in nfp_net_get_eeprom()
2459 return -EINVAL; in nfp_net_get_eeprom()
2461 eeprom->magic = app->pdev->vendor | (app->pdev->device << 16); in nfp_net_get_eeprom()
2462 memcpy(bytes, buf + eeprom->offset, eeprom->len); in nfp_net_get_eeprom()
2475 return -EOPNOTSUPP; in nfp_net_set_eeprom()
2477 if (eeprom->len == 0) in nfp_net_set_eeprom()
2478 return -EINVAL; in nfp_net_set_eeprom()
2480 if (eeprom->magic != (app->pdev->vendor | app->pdev->device << 16)) in nfp_net_set_eeprom()
2481 return -EINVAL; in nfp_net_set_eeprom()
2483 memcpy(buf + eeprom->offset, bytes, eeprom->len); in nfp_net_set_eeprom()
2485 return -EOPNOTSUPP; in nfp_net_set_eeprom()
2560 netdev->ethtool_ops = &nfp_net_ethtool_ops; in nfp_net_set_ethtool_ops()