|
|
@@ -31,9 +31,54 @@
|
|
|
* SOFTWARE.
|
|
|
*/
|
|
|
|
|
|
+#include <linux/rtnetlink.h>
|
|
|
#include <net/devlink.h>
|
|
|
|
|
|
+#include "nfpcore/nfp_nsp.h"
|
|
|
+#include "nfp_app.h"
|
|
|
#include "nfp_main.h"
|
|
|
+#include "nfp_port.h"
|
|
|
+
|
|
|
+static int
|
|
|
+nfp_devlink_fill_eth_port(struct nfp_port *port,
|
|
|
+ struct nfp_eth_table_port *copy)
|
|
|
+{
|
|
|
+ struct nfp_eth_table_port *eth_port;
|
|
|
+
|
|
|
+ eth_port = __nfp_port_get_eth_port(port);
|
|
|
+ if (!eth_port)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ memcpy(copy, eth_port, sizeof(*eth_port));
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
const struct devlink_ops nfp_devlink_ops = {
|
|
|
};
|
|
|
+
|
|
|
+int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
|
|
|
+{
|
|
|
+ struct nfp_eth_table_port eth_port;
|
|
|
+ struct devlink *devlink;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ rtnl_lock();
|
|
|
+ ret = nfp_devlink_fill_eth_port(port, ð_port);
|
|
|
+ rtnl_unlock();
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ devlink_port_type_eth_set(&port->dl_port, port->netdev);
|
|
|
+ if (eth_port.is_split)
|
|
|
+ devlink_port_split_set(&port->dl_port, eth_port.label_port);
|
|
|
+
|
|
|
+ devlink = priv_to_devlink(app->pf);
|
|
|
+
|
|
|
+ return devlink_port_register(devlink, &port->dl_port, port->eth_id);
|
|
|
+}
|
|
|
+
|
|
|
+void nfp_devlink_port_unregister(struct nfp_port *port)
|
|
|
+{
|
|
|
+ devlink_port_unregister(&port->dl_port);
|
|
|
+}
|