Skip to content

Commit

Permalink
ice: create port representor for SF
Browse files Browse the repository at this point in the history
Implement attaching and detaching SF port representor. It is done in the
same way as the VF port representor.

SF port representor is always added or removed with devlink
lock taken.

Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Michal Swiatkowski authored and Tony Nguyen committed Sep 6, 2024
1 parent 415db83 commit 977514f
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 4 deletions.
6 changes: 3 additions & 3 deletions drivers/net/ethernet/intel/ice/devlink/devlink_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ static void ice_dealloc_dynamic_port(struct ice_dynamic_port *dyn_port)
struct ice_pf *pf = dyn_port->pf;

xa_erase(&pf->sf_nums, devlink_port->attrs.pci_sf.sf);
devl_port_unregister(devlink_port);
ice_eswitch_detach_sf(pf, dyn_port);
ice_vsi_free(dyn_port->vsi);
xa_erase(&pf->dyn_ports, dyn_port->vsi->idx);
kfree(dyn_port);
Expand Down Expand Up @@ -765,9 +765,9 @@ ice_alloc_dynamic_port(struct ice_pf *pf,
goto unroll_vsi_alloc;
}

err = ice_devlink_create_sf_port(dyn_port);
err = ice_eswitch_attach_sf(pf, dyn_port);
if (err) {
NL_SET_ERR_MSG_MOD(extack, "Port registration failed");
NL_SET_ERR_MSG_MOD(extack, "Failed to attach SF to eswitch");
goto unroll_xa_insert;
}

Expand Down
39 changes: 39 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_eswitch.c
Original file line number Diff line number Diff line change
Expand Up @@ -525,6 +525,30 @@ int ice_eswitch_attach_vf(struct ice_pf *pf, struct ice_vf *vf)
return err;
}

/**
* ice_eswitch_attach_sf - attach SF to a eswitch
* @pf: pointer to PF structure
* @sf: pointer to SF structure to be attached
*
* During attaching port representor for SF is created.
*
* Return: zero on success or an error code on failure.
*/
int ice_eswitch_attach_sf(struct ice_pf *pf, struct ice_dynamic_port *sf)
{
struct ice_repr *repr = ice_repr_create_sf(sf);
int err;

if (IS_ERR(repr))
return PTR_ERR(repr);

err = ice_eswitch_attach(pf, repr, &sf->repr_id);
if (err)
ice_repr_destroy(repr);

return err;
}

static void ice_eswitch_detach(struct ice_pf *pf, struct ice_repr *repr)
{
ice_eswitch_stop_reprs(pf);
Expand Down Expand Up @@ -568,6 +592,21 @@ void ice_eswitch_detach_vf(struct ice_pf *pf, struct ice_vf *vf)
devl_unlock(devlink);
}

/**
* ice_eswitch_detach_sf - detach SF from a eswitch
* @pf: pointer to PF structure
* @sf: pointer to SF structure to be detached
*/
void ice_eswitch_detach_sf(struct ice_pf *pf, struct ice_dynamic_port *sf)
{
struct ice_repr *repr = xa_load(&pf->eswitch.reprs, sf->repr_id);

if (!repr)
return;

ice_eswitch_detach(pf, repr);
}

/**
* ice_eswitch_get_target - get netdev based on src_vsi from descriptor
* @rx_ring: ring used to receive the packet
Expand Down
11 changes: 11 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_eswitch.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@

#ifdef CONFIG_ICE_SWITCHDEV
void ice_eswitch_detach_vf(struct ice_pf *pf, struct ice_vf *vf);
void ice_eswitch_detach_sf(struct ice_pf *pf, struct ice_dynamic_port *sf);
int ice_eswitch_attach_vf(struct ice_pf *pf, struct ice_vf *vf);
int ice_eswitch_attach_sf(struct ice_pf *pf, struct ice_dynamic_port *sf);

int ice_eswitch_mode_get(struct devlink *devlink, u16 *mode);
int
Expand All @@ -34,12 +36,21 @@ void ice_eswitch_decfg_vsi(struct ice_vsi *vsi, const u8 *mac);
static inline void
ice_eswitch_detach_vf(struct ice_pf *pf, struct ice_vf *vf) { }

static inline void
ice_eswitch_detach_sf(struct ice_pf *pf, struct ice_dynamic_port *sf) { }

static inline int
ice_eswitch_attach_vf(struct ice_pf *pf, struct ice_vf *vf)
{
return -EOPNOTSUPP;
}

static inline int
ice_eswitch_attach_sf(struct ice_pf *pf, struct ice_dynamic_port *sf)
{
return -EOPNOTSUPP;
}

static inline void ice_eswitch_stop_all_tx_queues(struct ice_pf *pf) { }

static inline void
Expand Down
52 changes: 52 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_repr.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,12 @@ static void ice_repr_rem_vf(struct ice_repr *repr)
ice_virtchnl_set_dflt_ops(repr->vf);
}

static void ice_repr_rem_sf(struct ice_repr *repr)
{
unregister_netdev(repr->netdev);
ice_devlink_destroy_sf_port(repr->sf);
}

static void ice_repr_set_tx_topology(struct ice_pf *pf)
{
struct devlink *devlink;
Expand Down Expand Up @@ -420,6 +426,52 @@ struct ice_repr *ice_repr_create_vf(struct ice_vf *vf)
return repr;
}

static int ice_repr_add_sf(struct ice_repr *repr)
{
struct ice_dynamic_port *sf = repr->sf;
int err;

err = ice_devlink_create_sf_port(sf);
if (err)
return err;

SET_NETDEV_DEVLINK_PORT(repr->netdev, &sf->devlink_port);
err = ice_repr_reg_netdev(repr->netdev);
if (err)
goto err_netdev;

return 0;

err_netdev:
ice_devlink_destroy_sf_port(sf);
return err;
}

/**
* ice_repr_create_sf - add representor for SF VSI
* @sf: SF to create port representor on
*
* Set correct representor type for SF and functions pointer.
*
* Return: created port representor on success, error otherwise
*/
struct ice_repr *ice_repr_create_sf(struct ice_dynamic_port *sf)
{
struct ice_repr *repr = ice_repr_create(sf->vsi);

if (!repr)
return ERR_PTR(-ENOMEM);

repr->type = ICE_REPR_TYPE_SF;
repr->sf = sf;
repr->ops.add = ice_repr_add_sf;
repr->ops.rem = ice_repr_rem_sf;

ether_addr_copy(repr->parent_mac, sf->hw_addr);

return repr;
}

struct ice_repr *ice_repr_get(struct ice_pf *pf, u32 id)
{
return xa_load(&pf->eswitch.reprs, id);
Expand Down
7 changes: 6 additions & 1 deletion drivers/net/ethernet/intel/ice/ice_repr.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ struct ice_repr_pcpu_stats {

enum ice_repr_type {
ICE_REPR_TYPE_VF,
ICE_REPR_TYPE_SF,
};

struct ice_repr {
Expand All @@ -28,14 +29,18 @@ struct ice_repr {
u32 id;
u8 parent_mac[ETH_ALEN];
enum ice_repr_type type;
struct ice_vf *vf;
union {
struct ice_vf *vf;
struct ice_dynamic_port *sf;
};
struct {
int (*add)(struct ice_repr *repr);
void (*rem)(struct ice_repr *repr);
} ops;
};

struct ice_repr *ice_repr_create_vf(struct ice_vf *vf);
struct ice_repr *ice_repr_create_sf(struct ice_dynamic_port *sf);

void ice_repr_destroy(struct ice_repr *repr);

Expand Down
2 changes: 2 additions & 0 deletions drivers/net/ethernet/intel/ice/ice_sf_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ static int ice_sf_dev_probe(struct auxiliary_device *adev,
}
vsi->sf = dyn_port;

ice_eswitch_update_repr(&dyn_port->repr_id, vsi);

err = ice_devlink_create_sf_dev_port(sf_dev);
if (err) {
dev_err(dev, "Cannot add ice virtual devlink port for subfunction");
Expand Down

0 comments on commit 977514f

Please sign in to comment.