Commit 5d7c64a7 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

nfp: move representors' struct net_device_ops to shared code

Apps shouldn't declare their own struct net_device_ops for
representors, this makes sharing code harder.  Add necessary
nfp_app callbacks and move the definition of representors'
struct net_device_ops to common code.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3238b250
...@@ -79,9 +79,8 @@ nfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size, ...@@ -79,9 +79,8 @@ nfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size,
return skb; return skb;
} }
int nfp_flower_cmsg_portmod(struct net_device *netdev, bool carrier_ok) int nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok)
{ {
struct nfp_repr *repr = netdev_priv(netdev);
struct nfp_flower_cmsg_portmod *msg; struct nfp_flower_cmsg_portmod *msg;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -94,7 +93,7 @@ int nfp_flower_cmsg_portmod(struct net_device *netdev, bool carrier_ok) ...@@ -94,7 +93,7 @@ int nfp_flower_cmsg_portmod(struct net_device *netdev, bool carrier_ok)
msg->portnum = cpu_to_be32(repr->dst->u.port_info.port_id); msg->portnum = cpu_to_be32(repr->dst->u.port_info.port_id);
msg->reserved = 0; msg->reserved = 0;
msg->info = carrier_ok; msg->info = carrier_ok;
msg->mtu = cpu_to_be16(netdev->mtu); msg->mtu = cpu_to_be16(repr->netdev->mtu);
nfp_ctrl_tx(repr->app->ctrl, skb); nfp_ctrl_tx(repr->app->ctrl, skb);
......
...@@ -110,7 +110,7 @@ nfp_flower_cmsg_pcie_port(u8 nfp_pcie, enum nfp_flower_cmsg_port_vnic_type type, ...@@ -110,7 +110,7 @@ nfp_flower_cmsg_pcie_port(u8 nfp_pcie, enum nfp_flower_cmsg_port_vnic_type type,
NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT); NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT);
} }
int nfp_flower_cmsg_portmod(struct net_device *netdev, bool carrier_ok); int nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok);
void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb); void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb);
#endif #endif
...@@ -104,37 +104,30 @@ nfp_flower_repr_get(struct nfp_app *app, u32 port_id) ...@@ -104,37 +104,30 @@ nfp_flower_repr_get(struct nfp_app *app, u32 port_id)
return reprs->reprs[port]; return reprs->reprs[port];
} }
static int nfp_flower_repr_netdev_open(struct net_device *netdev) static int
nfp_flower_repr_netdev_open(struct nfp_app *app, struct nfp_repr *repr)
{ {
int err; int err;
err = nfp_flower_cmsg_portmod(netdev, true); err = nfp_flower_cmsg_portmod(repr, true);
if (err) if (err)
return err; return err;
netif_carrier_on(netdev); netif_carrier_on(repr->netdev);
netif_tx_wake_all_queues(netdev); netif_tx_wake_all_queues(repr->netdev);
return 0; return 0;
} }
static int nfp_flower_repr_netdev_stop(struct net_device *netdev) static int
nfp_flower_repr_netdev_stop(struct nfp_app *app, struct nfp_repr *repr)
{ {
netif_carrier_off(netdev); netif_carrier_off(repr->netdev);
netif_tx_disable(netdev); netif_tx_disable(repr->netdev);
return nfp_flower_cmsg_portmod(netdev, false); return nfp_flower_cmsg_portmod(repr, false);
} }
static const struct net_device_ops nfp_flower_repr_netdev_ops = {
.ndo_open = nfp_flower_repr_netdev_open,
.ndo_stop = nfp_flower_repr_netdev_stop,
.ndo_start_xmit = nfp_repr_xmit,
.ndo_get_stats64 = nfp_repr_get_stats64,
.ndo_has_offload_stats = nfp_repr_has_offload_stats,
.ndo_get_offload_stats = nfp_repr_get_offload_stats,
};
static void nfp_flower_sriov_disable(struct nfp_app *app) static void nfp_flower_sriov_disable(struct nfp_app *app)
{ {
nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_VF); nfp_reprs_clean_and_free_by_type(app, NFP_REPR_TYPE_VF);
...@@ -182,7 +175,6 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app, ...@@ -182,7 +175,6 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app,
port_id = nfp_flower_cmsg_pcie_port(nfp_pcie, vnic_type, port_id = nfp_flower_cmsg_pcie_port(nfp_pcie, vnic_type,
i, queue); i, queue);
err = nfp_repr_init(app, reprs->reprs[i], err = nfp_repr_init(app, reprs->reprs[i],
&nfp_flower_repr_netdev_ops,
port_id, port, priv->nn->dp.netdev); port_id, port, priv->nn->dp.netdev);
if (err) { if (err) {
nfp_port_free(port); nfp_port_free(port);
...@@ -261,7 +253,6 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv) ...@@ -261,7 +253,6 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv)
cmsg_port_id = nfp_flower_cmsg_phys_port(phys_port); cmsg_port_id = nfp_flower_cmsg_phys_port(phys_port);
err = nfp_repr_init(app, reprs->reprs[phys_port], err = nfp_repr_init(app, reprs->reprs[phys_port],
&nfp_flower_repr_netdev_ops,
cmsg_port_id, port, priv->nn->dp.netdev); cmsg_port_id, port, priv->nn->dp.netdev);
if (err) { if (err) {
nfp_port_free(port); nfp_port_free(port);
...@@ -363,6 +354,9 @@ const struct nfp_app_type app_flower = { ...@@ -363,6 +354,9 @@ const struct nfp_app_type app_flower = {
.vnic_init = nfp_flower_vnic_init, .vnic_init = nfp_flower_vnic_init,
.repr_open = nfp_flower_repr_netdev_open,
.repr_stop = nfp_flower_repr_netdev_stop,
.start = nfp_flower_start, .start = nfp_flower_start,
.stop = nfp_flower_stop, .stop = nfp_flower_stop,
......
...@@ -47,6 +47,7 @@ struct sk_buff; ...@@ -47,6 +47,7 @@ struct sk_buff;
struct nfp_app; struct nfp_app;
struct nfp_cpp; struct nfp_cpp;
struct nfp_pf; struct nfp_pf;
struct nfp_repr;
struct nfp_net; struct nfp_net;
enum nfp_app_id { enum nfp_app_id {
...@@ -71,6 +72,8 @@ extern const struct nfp_app_type app_flower; ...@@ -71,6 +72,8 @@ extern const struct nfp_app_type app_flower;
* @extra_cap: extra capabilities string * @extra_cap: extra capabilities string
* @vnic_init: init vNICs (assign port types, etc.) * @vnic_init: init vNICs (assign port types, etc.)
* @vnic_clean: clean up app's vNIC state * @vnic_clean: clean up app's vNIC state
* @repr_open: representor netdev open callback
* @repr_stop: representor netdev stop callback
* @start: start application logic * @start: start application logic
* @stop: stop application logic * @stop: stop application logic
* @ctrl_msg_rx: control message handler * @ctrl_msg_rx: control message handler
...@@ -97,6 +100,9 @@ struct nfp_app_type { ...@@ -97,6 +100,9 @@ struct nfp_app_type {
unsigned int id); unsigned int id);
void (*vnic_clean)(struct nfp_app *app, struct nfp_net *nn); void (*vnic_clean)(struct nfp_app *app, struct nfp_net *nn);
int (*repr_open)(struct nfp_app *app, struct nfp_repr *repr);
int (*repr_stop)(struct nfp_app *app, struct nfp_repr *repr);
int (*start)(struct nfp_app *app); int (*start)(struct nfp_app *app);
void (*stop)(struct nfp_app *app); void (*stop)(struct nfp_app *app);
...@@ -164,6 +170,20 @@ static inline void nfp_app_vnic_clean(struct nfp_app *app, struct nfp_net *nn) ...@@ -164,6 +170,20 @@ static inline void nfp_app_vnic_clean(struct nfp_app *app, struct nfp_net *nn)
app->type->vnic_clean(app, nn); app->type->vnic_clean(app, nn);
} }
static inline int nfp_app_repr_open(struct nfp_app *app, struct nfp_repr *repr)
{
if (!app->type->repr_open)
return -EINVAL;
return app->type->repr_open(app, repr);
}
static inline int nfp_app_repr_stop(struct nfp_app *app, struct nfp_repr *repr)
{
if (!app->type->repr_stop)
return -EINVAL;
return app->type->repr_stop(app, repr);
}
static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl) static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl)
{ {
app->ctrl = ctrl; app->ctrl = ctrl;
......
...@@ -136,7 +136,7 @@ nfp_repr_pf_get_stats64(const struct nfp_app *app, u8 pf, ...@@ -136,7 +136,7 @@ nfp_repr_pf_get_stats64(const struct nfp_app *app, u8 pf,
stats->rx_dropped = readq(mem + NFP_NET_CFG_STATS_TX_DISCARDS); stats->rx_dropped = readq(mem + NFP_NET_CFG_STATS_TX_DISCARDS);
} }
void static void
nfp_repr_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats) nfp_repr_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
{ {
struct nfp_repr *repr = netdev_priv(netdev); struct nfp_repr *repr = netdev_priv(netdev);
...@@ -163,7 +163,7 @@ nfp_repr_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats) ...@@ -163,7 +163,7 @@ nfp_repr_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
} }
} }
bool static bool
nfp_repr_has_offload_stats(const struct net_device *dev, int attr_id) nfp_repr_has_offload_stats(const struct net_device *dev, int attr_id)
{ {
switch (attr_id) { switch (attr_id) {
...@@ -206,7 +206,8 @@ nfp_repr_get_host_stats64(const struct net_device *netdev, ...@@ -206,7 +206,8 @@ nfp_repr_get_host_stats64(const struct net_device *netdev,
return 0; return 0;
} }
int nfp_repr_get_offload_stats(int attr_id, const struct net_device *dev, static int
nfp_repr_get_offload_stats(int attr_id, const struct net_device *dev,
void *stats) void *stats)
{ {
switch (attr_id) { switch (attr_id) {
...@@ -217,7 +218,7 @@ int nfp_repr_get_offload_stats(int attr_id, const struct net_device *dev, ...@@ -217,7 +218,7 @@ int nfp_repr_get_offload_stats(int attr_id, const struct net_device *dev,
return -EINVAL; return -EINVAL;
} }
netdev_tx_t nfp_repr_xmit(struct sk_buff *skb, struct net_device *netdev) static netdev_tx_t nfp_repr_xmit(struct sk_buff *skb, struct net_device *netdev)
{ {
struct nfp_repr *repr = netdev_priv(netdev); struct nfp_repr *repr = netdev_priv(netdev);
unsigned int len = skb->len; unsigned int len = skb->len;
...@@ -234,6 +235,29 @@ netdev_tx_t nfp_repr_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -234,6 +235,29 @@ netdev_tx_t nfp_repr_xmit(struct sk_buff *skb, struct net_device *netdev)
return ret; return ret;
} }
static int nfp_repr_stop(struct net_device *netdev)
{
struct nfp_repr *repr = netdev_priv(netdev);
return nfp_app_repr_stop(repr->app, repr);
}
static int nfp_repr_open(struct net_device *netdev)
{
struct nfp_repr *repr = netdev_priv(netdev);
return nfp_app_repr_open(repr->app, repr);
}
static const struct net_device_ops nfp_repr_netdev_ops = {
.ndo_open = nfp_repr_open,
.ndo_stop = nfp_repr_stop,
.ndo_start_xmit = nfp_repr_xmit,
.ndo_get_stats64 = nfp_repr_get_stats64,
.ndo_has_offload_stats = nfp_repr_has_offload_stats,
.ndo_get_offload_stats = nfp_repr_get_offload_stats,
};
static void nfp_repr_clean(struct nfp_repr *repr) static void nfp_repr_clean(struct nfp_repr *repr)
{ {
unregister_netdev(repr->netdev); unregister_netdev(repr->netdev);
...@@ -258,8 +282,8 @@ static void nfp_repr_set_lockdep_class(struct net_device *dev) ...@@ -258,8 +282,8 @@ static void nfp_repr_set_lockdep_class(struct net_device *dev)
} }
int nfp_repr_init(struct nfp_app *app, struct net_device *netdev, int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
const struct net_device_ops *netdev_ops, u32 cmsg_port_id, u32 cmsg_port_id, struct nfp_port *port,
struct nfp_port *port, struct net_device *pf_netdev) struct net_device *pf_netdev)
{ {
struct nfp_repr *repr = netdev_priv(netdev); struct nfp_repr *repr = netdev_priv(netdev);
int err; int err;
...@@ -273,7 +297,7 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev, ...@@ -273,7 +297,7 @@ int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
repr->dst->u.port_info.port_id = cmsg_port_id; repr->dst->u.port_info.port_id = cmsg_port_id;
repr->dst->u.port_info.lower_dev = pf_netdev; repr->dst->u.port_info.lower_dev = pf_netdev;
netdev->netdev_ops = netdev_ops; netdev->netdev_ops = &nfp_repr_netdev_ops;
err = register_netdev(netdev); err = register_netdev(netdev);
if (err) if (err)
......
...@@ -98,15 +98,7 @@ enum nfp_repr_type { ...@@ -98,15 +98,7 @@ enum nfp_repr_type {
#define NFP_REPR_TYPE_MAX (__NFP_REPR_TYPE_MAX - 1) #define NFP_REPR_TYPE_MAX (__NFP_REPR_TYPE_MAX - 1)
void nfp_repr_inc_rx_stats(struct net_device *netdev, unsigned int len); void nfp_repr_inc_rx_stats(struct net_device *netdev, unsigned int len);
void
nfp_repr_get_stats64(struct net_device *netdev,
struct rtnl_link_stats64 *stats);
bool nfp_repr_has_offload_stats(const struct net_device *dev, int attr_id);
int nfp_repr_get_offload_stats(int attr_id, const struct net_device *dev,
void *stats);
netdev_tx_t nfp_repr_xmit(struct sk_buff *skb, struct net_device *netdev);
int nfp_repr_init(struct nfp_app *app, struct net_device *netdev, int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
const struct net_device_ops *netdev_ops,
u32 cmsg_port_id, struct nfp_port *port, u32 cmsg_port_id, struct nfp_port *port,
struct net_device *pf_netdev); struct net_device *pf_netdev);
struct net_device *nfp_repr_alloc(struct nfp_app *app); struct net_device *nfp_repr_alloc(struct nfp_app *app);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment