mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-16 01:54:00 +00:00
octeontx2-pf: Add devlink port support
Register devlink port for the rvu representors. Signed-off-by: Geetha sowjanya <gakula@marvell.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2f7f33a095
commit
9ed0343f56
@ -1583,6 +1583,7 @@ struct rep_evt_data {
|
||||
u16 rx_mode;
|
||||
u16 rx_flags;
|
||||
u16 mtu;
|
||||
u8 mac[ETH_ALEN];
|
||||
u64 rsvd[5];
|
||||
};
|
||||
|
||||
@ -1593,6 +1594,7 @@ struct rep_event {
|
||||
#define RVU_EVENT_PFVF_STATE BIT_ULL(1)
|
||||
#define RVU_EVENT_MTU_CHANGE BIT_ULL(2)
|
||||
#define RVU_EVENT_RX_MODE_CHANGE BIT_ULL(3)
|
||||
#define RVU_EVENT_MAC_ADDR_CHANGE BIT_ULL(4)
|
||||
u16 event;
|
||||
struct rep_evt_data evt_data;
|
||||
};
|
||||
|
@ -35,11 +35,15 @@ MBOX_UP_REP_MESSAGES
|
||||
|
||||
static int rvu_rep_up_notify(struct rvu *rvu, struct rep_event *event)
|
||||
{
|
||||
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, event->pcifunc);
|
||||
struct rep_event *msg;
|
||||
int pf;
|
||||
|
||||
pf = rvu_get_pf(event->pcifunc);
|
||||
|
||||
if (event->event & RVU_EVENT_MAC_ADDR_CHANGE)
|
||||
ether_addr_copy(pfvf->mac_addr, event->evt_data.mac);
|
||||
|
||||
mutex_lock(&rvu->mbox_lock);
|
||||
msg = otx2_mbox_alloc_msg_rep_event_up_notify(rvu, pf);
|
||||
if (!msg) {
|
||||
|
@ -28,6 +28,89 @@ MODULE_DESCRIPTION(DRV_STRING);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DEVICE_TABLE(pci, rvu_rep_id_table);
|
||||
|
||||
static int rvu_rep_notify_pfvf(struct otx2_nic *priv, u16 event,
|
||||
struct rep_event *data);
|
||||
|
||||
static int rvu_rep_dl_port_fn_hw_addr_get(struct devlink_port *port,
|
||||
u8 *hw_addr, int *hw_addr_len,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct rep_dev *rep = container_of(port, struct rep_dev, dl_port);
|
||||
|
||||
ether_addr_copy(hw_addr, rep->mac);
|
||||
*hw_addr_len = ETH_ALEN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rvu_rep_dl_port_fn_hw_addr_set(struct devlink_port *port,
|
||||
const u8 *hw_addr, int hw_addr_len,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct rep_dev *rep = container_of(port, struct rep_dev, dl_port);
|
||||
struct otx2_nic *priv = rep->mdev;
|
||||
struct rep_event evt = {0};
|
||||
|
||||
eth_hw_addr_set(rep->netdev, hw_addr);
|
||||
ether_addr_copy(rep->mac, hw_addr);
|
||||
|
||||
ether_addr_copy(evt.evt_data.mac, hw_addr);
|
||||
evt.pcifunc = rep->pcifunc;
|
||||
rvu_rep_notify_pfvf(priv, RVU_EVENT_MAC_ADDR_CHANGE, &evt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct devlink_port_ops rvu_rep_dl_port_ops = {
|
||||
.port_fn_hw_addr_get = rvu_rep_dl_port_fn_hw_addr_get,
|
||||
.port_fn_hw_addr_set = rvu_rep_dl_port_fn_hw_addr_set,
|
||||
};
|
||||
|
||||
static void
|
||||
rvu_rep_devlink_set_switch_id(struct otx2_nic *priv,
|
||||
struct netdev_phys_item_id *ppid)
|
||||
{
|
||||
struct pci_dev *pdev = priv->pdev;
|
||||
u64 id;
|
||||
|
||||
id = pci_get_dsn(pdev);
|
||||
|
||||
ppid->id_len = sizeof(id);
|
||||
put_unaligned_be64(id, &ppid->id);
|
||||
}
|
||||
|
||||
static void rvu_rep_devlink_port_unregister(struct rep_dev *rep)
|
||||
{
|
||||
devlink_port_unregister(&rep->dl_port);
|
||||
}
|
||||
|
||||
static int rvu_rep_devlink_port_register(struct rep_dev *rep)
|
||||
{
|
||||
struct devlink_port_attrs attrs = {};
|
||||
struct otx2_nic *priv = rep->mdev;
|
||||
struct devlink *dl = priv->dl->dl;
|
||||
int err;
|
||||
|
||||
if (!(rep->pcifunc & RVU_PFVF_FUNC_MASK)) {
|
||||
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
|
||||
attrs.phys.port_number = rvu_get_pf(rep->pcifunc);
|
||||
} else {
|
||||
attrs.flavour = DEVLINK_PORT_FLAVOUR_PCI_VF;
|
||||
attrs.pci_vf.pf = rvu_get_pf(rep->pcifunc);
|
||||
attrs.pci_vf.vf = rep->pcifunc & RVU_PFVF_FUNC_MASK;
|
||||
}
|
||||
|
||||
rvu_rep_devlink_set_switch_id(priv, &attrs.switch_id);
|
||||
devlink_port_attrs_set(&rep->dl_port, &attrs);
|
||||
|
||||
err = devl_port_register_with_ops(dl, &rep->dl_port, rep->rep_id,
|
||||
&rvu_rep_dl_port_ops);
|
||||
if (err) {
|
||||
dev_err(rep->mdev->dev, "devlink_port_register failed: %d\n",
|
||||
err);
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rvu_rep_get_repid(struct otx2_nic *priv, u16 pcifunc)
|
||||
{
|
||||
int rep_id;
|
||||
@ -386,6 +469,7 @@ void rvu_rep_destroy(struct otx2_nic *priv)
|
||||
for (rep_id = 0; rep_id < priv->rep_cnt; rep_id++) {
|
||||
rep = priv->reps[rep_id];
|
||||
unregister_netdev(rep->netdev);
|
||||
rvu_rep_devlink_port_unregister(rep);
|
||||
free_netdev(rep->netdev);
|
||||
}
|
||||
kfree(priv->reps);
|
||||
@ -439,6 +523,11 @@ int rvu_rep_create(struct otx2_nic *priv, struct netlink_ext_ack *extack)
|
||||
|
||||
ndev->features |= ndev->hw_features;
|
||||
eth_hw_addr_random(ndev);
|
||||
err = rvu_rep_devlink_port_register(rep);
|
||||
if (err)
|
||||
goto exit;
|
||||
|
||||
SET_NETDEV_DEVLINK_PORT(ndev, &rep->dl_port);
|
||||
err = register_netdev(ndev);
|
||||
if (err) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
@ -459,6 +548,7 @@ exit:
|
||||
while (--rep_id >= 0) {
|
||||
rep = priv->reps[rep_id];
|
||||
unregister_netdev(rep->netdev);
|
||||
rvu_rep_devlink_port_unregister(rep);
|
||||
free_netdev(rep->netdev);
|
||||
}
|
||||
kfree(priv->reps);
|
||||
|
@ -34,10 +34,12 @@ struct rep_dev {
|
||||
struct net_device *netdev;
|
||||
struct rep_stats stats;
|
||||
struct delayed_work stats_wrk;
|
||||
struct devlink_port dl_port;
|
||||
#define RVU_REP_VF_INITIALIZED BIT_ULL(0)
|
||||
u64 flags;
|
||||
u16 rep_id;
|
||||
u16 pcifunc;
|
||||
u8 mac[ETH_ALEN];
|
||||
};
|
||||
|
||||
static inline bool otx2_rep_dev(struct pci_dev *pdev)
|
||||
|
Loading…
x
Reference in New Issue
Block a user