18aa0cb00SJakub Kicinski /*
28aa0cb00SJakub Kicinski  * Copyright (C) 2017 Netronome Systems, Inc.
38aa0cb00SJakub Kicinski  *
48aa0cb00SJakub Kicinski  * This software is dual licensed under the GNU General License Version 2,
58aa0cb00SJakub Kicinski  * June 1991 as shown in the file COPYING in the top-level directory of this
68aa0cb00SJakub Kicinski  * source tree or the BSD 2-Clause License provided below.  You have the
78aa0cb00SJakub Kicinski  * option to license this software under the complete terms of either license.
88aa0cb00SJakub Kicinski  *
98aa0cb00SJakub Kicinski  * The BSD 2-Clause License:
108aa0cb00SJakub Kicinski  *
118aa0cb00SJakub Kicinski  *     Redistribution and use in source and binary forms, with or
128aa0cb00SJakub Kicinski  *     without modification, are permitted provided that the following
138aa0cb00SJakub Kicinski  *     conditions are met:
148aa0cb00SJakub Kicinski  *
158aa0cb00SJakub Kicinski  *      1. Redistributions of source code must retain the above
168aa0cb00SJakub Kicinski  *         copyright notice, this list of conditions and the following
178aa0cb00SJakub Kicinski  *         disclaimer.
188aa0cb00SJakub Kicinski  *
198aa0cb00SJakub Kicinski  *      2. Redistributions in binary form must reproduce the above
208aa0cb00SJakub Kicinski  *         copyright notice, this list of conditions and the following
218aa0cb00SJakub Kicinski  *         disclaimer in the documentation and/or other materials
228aa0cb00SJakub Kicinski  *         provided with the distribution.
238aa0cb00SJakub Kicinski  *
248aa0cb00SJakub Kicinski  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
258aa0cb00SJakub Kicinski  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
268aa0cb00SJakub Kicinski  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
278aa0cb00SJakub Kicinski  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
288aa0cb00SJakub Kicinski  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
298aa0cb00SJakub Kicinski  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
308aa0cb00SJakub Kicinski  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
318aa0cb00SJakub Kicinski  * SOFTWARE.
328aa0cb00SJakub Kicinski  */
338aa0cb00SJakub Kicinski 
348aa0cb00SJakub Kicinski #include "nfpcore/nfp_cpp.h"
358aa0cb00SJakub Kicinski #include "nfpcore/nfp_nsp.h"
368aa0cb00SJakub Kicinski #include "nfp_app.h"
378aa0cb00SJakub Kicinski #include "nfp_main.h"
388aa0cb00SJakub Kicinski #include "nfp_net.h"
398aa0cb00SJakub Kicinski #include "nfp_port.h"
408aa0cb00SJakub Kicinski 
418aa0cb00SJakub Kicinski static int
428aa0cb00SJakub Kicinski nfp_app_nic_vnic_init_phy_port(struct nfp_pf *pf, struct nfp_app *app,
438aa0cb00SJakub Kicinski 			       struct nfp_net *nn, unsigned int id)
448aa0cb00SJakub Kicinski {
45a7ceb990SJakub Kicinski 	int err;
46a7ceb990SJakub Kicinski 
478aa0cb00SJakub Kicinski 	if (!pf->eth_tbl)
488aa0cb00SJakub Kicinski 		return 0;
498aa0cb00SJakub Kicinski 
508aa0cb00SJakub Kicinski 	nn->port = nfp_port_alloc(app, NFP_PORT_PHYS_PORT, nn->dp.netdev);
518aa0cb00SJakub Kicinski 	if (IS_ERR(nn->port))
528aa0cb00SJakub Kicinski 		return PTR_ERR(nn->port);
538aa0cb00SJakub Kicinski 
54a7ceb990SJakub Kicinski 	err = nfp_port_init_phy_port(pf, app, nn->port, id);
55a7ceb990SJakub Kicinski 	if (err) {
568aa0cb00SJakub Kicinski 		nfp_port_free(nn->port);
57a7ceb990SJakub Kicinski 		return err;
588aa0cb00SJakub Kicinski 	}
598aa0cb00SJakub Kicinski 
60a7ceb990SJakub Kicinski 	return nn->port->type == NFP_PORT_INVALID;
618aa0cb00SJakub Kicinski }
628aa0cb00SJakub Kicinski 
63c496291cSJakub Kicinski int nfp_app_nic_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
648aa0cb00SJakub Kicinski 			   unsigned int id)
658aa0cb00SJakub Kicinski {
668aa0cb00SJakub Kicinski 	int err;
678aa0cb00SJakub Kicinski 
688aa0cb00SJakub Kicinski 	err = nfp_app_nic_vnic_init_phy_port(app->pf, app, nn, id);
698aa0cb00SJakub Kicinski 	if (err)
708aa0cb00SJakub Kicinski 		return err < 0 ? err : 0;
718aa0cb00SJakub Kicinski 
72c55ca688SJakub Kicinski 	nfp_net_get_mac_addr(app->pf, nn->dp.netdev, nn->port);
738aa0cb00SJakub Kicinski 
748aa0cb00SJakub Kicinski 	return 0;
758aa0cb00SJakub Kicinski }
76