]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
octeon_ep: add ndo ops for VFs in PF driver
authorShinas Rasheed <srasheed@marvell.com>
Fri, 6 Dec 2024 06:41:34 +0000 (22:41 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 10 Dec 2024 00:13:51 +0000 (16:13 -0800)
These APIs are needed to support applications that use netlink to get VF
information from a PF driver.

Signed-off-by: Shinas Rasheed <srasheed@marvell.com>
Link: https://patch.msgid.link/20241206064135.2331790-1-srasheed@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeon_ep/octep_main.c
drivers/net/ethernet/marvell/octeon_ep/octep_main.h
drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c
drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.h

index 549436efc20488a3ab2d0ae978ba498d050ffbbf..3a9825883d79ae94650c7f9a7a617f002eb7e3b4 100644 (file)
@@ -1137,6 +1137,43 @@ static int octep_set_features(struct net_device *dev, netdev_features_t features
        return err;
 }
 
+static int octep_get_vf_config(struct net_device *dev, int vf,
+                              struct ifla_vf_info *ivi)
+{
+       struct octep_device *oct = netdev_priv(dev);
+
+       ivi->vf = vf;
+       ether_addr_copy(ivi->mac, oct->vf_info[vf].mac_addr);
+       ivi->spoofchk = true;
+       ivi->linkstate = IFLA_VF_LINK_STATE_ENABLE;
+       ivi->trusted = false;
+
+       return 0;
+}
+
+static int octep_set_vf_mac(struct net_device *dev, int vf, u8 *mac)
+{
+       struct octep_device *oct = netdev_priv(dev);
+       int err;
+
+       if (!is_valid_ether_addr(mac)) {
+               dev_err(&oct->pdev->dev, "Invalid  MAC Address %pM\n", mac);
+               return -EADDRNOTAVAIL;
+       }
+
+       dev_dbg(&oct->pdev->dev, "set vf-%d mac to %pM\n", vf, mac);
+       ether_addr_copy(oct->vf_info[vf].mac_addr, mac);
+       oct->vf_info[vf].flags |= OCTEON_PFVF_FLAG_MAC_SET_BY_PF;
+
+       err = octep_ctrl_net_set_mac_addr(oct, vf, mac, true);
+       if (err)
+               dev_err(&oct->pdev->dev,
+                       "Set VF%d MAC address failed via host control Mbox\n",
+                       vf);
+
+       return err;
+}
+
 static const struct net_device_ops octep_netdev_ops = {
        .ndo_open                = octep_open,
        .ndo_stop                = octep_stop,
@@ -1146,6 +1183,8 @@ static const struct net_device_ops octep_netdev_ops = {
        .ndo_set_mac_address     = octep_set_mac,
        .ndo_change_mtu          = octep_change_mtu,
        .ndo_set_features        = octep_set_features,
+       .ndo_get_vf_config       = octep_get_vf_config,
+       .ndo_set_vf_mac          = octep_set_vf_mac
 };
 
 /**
index fee59e0e0138feecdab5bf8fecd9334172bd894a..3b56916af4688120b51364eb51bae8d3591ef969 100644 (file)
@@ -220,6 +220,7 @@ struct octep_iface_link_info {
 /* The Octeon VF device specific info data structure.*/
 struct octep_pfvf_info {
        u8 mac_addr[ETH_ALEN];
+       u32 flags;
        u32 mbox_version;
 };
 
index e6eb98d70f3c427c5e01a76a100e70420f0bb7c0..ebecdd29f3bd05fdbd1d8ac80c33aa46098b03fe 100644 (file)
@@ -156,12 +156,23 @@ static void octep_pfvf_set_mac_addr(struct octep_device *oct,  u32 vf_id,
 {
        int err;
 
+       if (oct->vf_info[vf_id].flags & OCTEON_PFVF_FLAG_MAC_SET_BY_PF) {
+               dev_err(&oct->pdev->dev,
+                       "VF%d attempted to override administrative set MAC address\n",
+                       vf_id);
+               rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK;
+               return;
+       }
+
        err = octep_ctrl_net_set_mac_addr(oct, vf_id, cmd.s_set_mac.mac_addr, true);
        if (err) {
                rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK;
-               dev_err(&oct->pdev->dev, "Set VF MAC address failed via host control Mbox\n");
+               dev_err(&oct->pdev->dev, "Set VF%d MAC address failed via host control Mbox\n",
+                       vf_id);
                return;
        }
+
+       ether_addr_copy(oct->vf_info[vf_id].mac_addr, cmd.s_set_mac.mac_addr);
        rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK;
 }
 
@@ -171,10 +182,18 @@ static void octep_pfvf_get_mac_addr(struct octep_device *oct,  u32 vf_id,
 {
        int err;
 
+       if (oct->vf_info[vf_id].flags & OCTEON_PFVF_FLAG_MAC_SET_BY_PF) {
+               dev_dbg(&oct->pdev->dev, "VF%d MAC address set by PF\n", vf_id);
+               ether_addr_copy(rsp->s_set_mac.mac_addr,
+                               oct->vf_info[vf_id].mac_addr);
+               rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK;
+               return;
+       }
        err = octep_ctrl_net_get_mac_addr(oct, vf_id, rsp->s_set_mac.mac_addr);
        if (err) {
                rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_NACK;
-               dev_err(&oct->pdev->dev, "Get VF MAC address failed via host control Mbox\n");
+               dev_err(&oct->pdev->dev, "Get VF%d MAC address failed via host control Mbox\n",
+                       vf_id);
                return;
        }
        rsp->s_set_mac.type = OCTEP_PFVF_MBOX_TYPE_RSP_ACK;
index 0dc6eead292a383723a62a3521c87409f2ce5032..386a095a99bc4fd935079407f3de164e8b01d5f9 100644 (file)
@@ -8,8 +8,6 @@
 #ifndef _OCTEP_PFVF_MBOX_H_
 #define _OCTEP_PFVF_MBOX_H_
 
-/* VF flags */
-#define OCTEON_PFVF_FLAG_MAC_SET_BY_PF  BIT_ULL(0) /* PF has set VF MAC address */
 #define OCTEON_SDP_16K_HW_FRS  16380UL
 #define OCTEON_SDP_64K_HW_FRS  65531UL
 
@@ -23,6 +21,10 @@ enum octep_pfvf_mbox_version {
 
 #define OCTEP_PFVF_MBOX_VERSION_CURRENT        OCTEP_PFVF_MBOX_VERSION_V2
 
+/* VF flags */
+/* PF has set VF MAC address */
+#define OCTEON_PFVF_FLAG_MAC_SET_BY_PF  BIT(0)
+
 enum octep_pfvf_mbox_opcode {
        OCTEP_PFVF_MBOX_CMD_VERSION,
        OCTEP_PFVF_MBOX_CMD_SET_MTU,