162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 262306a36Sopenharmony_ci/* Copyright (C) 2017 Netronome Systems, Inc. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include "../nfpcore/nfp_cpp.h" 562306a36Sopenharmony_ci#include "../nfpcore/nfp_nsp.h" 662306a36Sopenharmony_ci#include "../nfp_app.h" 762306a36Sopenharmony_ci#include "../nfp_main.h" 862306a36Sopenharmony_ci#include "../nfp_net.h" 962306a36Sopenharmony_ci#include "main.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistatic int nfp_nic_init(struct nfp_app *app) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci struct nfp_pf *pf = app->pf; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci if (pf->eth_tbl && pf->max_data_vnics != pf->eth_tbl->count) { 1662306a36Sopenharmony_ci nfp_err(pf->cpp, "ETH entries don't match vNICs (%d vs %d)\n", 1762306a36Sopenharmony_ci pf->max_data_vnics, pf->eth_tbl->count); 1862306a36Sopenharmony_ci return -EINVAL; 1962306a36Sopenharmony_ci } 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci return 0; 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic int nfp_nic_sriov_enable(struct nfp_app *app, int num_vfs) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci return 0; 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic void nfp_nic_sriov_disable(struct nfp_app *app) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic int nfp_nic_vnic_init(struct nfp_app *app, struct nfp_net *nn) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci return nfp_nic_dcb_init(nn); 3662306a36Sopenharmony_ci} 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic void nfp_nic_vnic_clean(struct nfp_app *app, struct nfp_net *nn) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci nfp_nic_dcb_clean(nn); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic int nfp_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, 4462306a36Sopenharmony_ci unsigned int id) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci struct nfp_app_nic_private *app_pri = nn->app_priv; 4762306a36Sopenharmony_ci int err; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci err = nfp_app_nic_vnic_alloc(app, nn, id); 5062306a36Sopenharmony_ci if (err) 5162306a36Sopenharmony_ci return err; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci if (sizeof(*app_pri)) { 5462306a36Sopenharmony_ci nn->app_priv = kzalloc(sizeof(*app_pri), GFP_KERNEL); 5562306a36Sopenharmony_ci if (!nn->app_priv) 5662306a36Sopenharmony_ci return -ENOMEM; 5762306a36Sopenharmony_ci } 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci return 0; 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic void nfp_nic_vnic_free(struct nfp_app *app, struct nfp_net *nn) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci kfree(nn->app_priv); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ciconst struct nfp_app_type app_nic = { 6862306a36Sopenharmony_ci .id = NFP_APP_CORE_NIC, 6962306a36Sopenharmony_ci .name = "nic", 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci .init = nfp_nic_init, 7262306a36Sopenharmony_ci .vnic_alloc = nfp_nic_vnic_alloc, 7362306a36Sopenharmony_ci .vnic_free = nfp_nic_vnic_free, 7462306a36Sopenharmony_ci .sriov_enable = nfp_nic_sriov_enable, 7562306a36Sopenharmony_ci .sriov_disable = nfp_nic_sriov_disable, 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci .vnic_init = nfp_nic_vnic_init, 7862306a36Sopenharmony_ci .vnic_clean = nfp_nic_vnic_clean, 7962306a36Sopenharmony_ci}; 80