The branch stable/13 has been updated by kp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=f0f1580cab2738b734d956eae9c551b9678cd4d5

commit f0f1580cab2738b734d956eae9c551b9678cd4d5
Author:     Kristof Provost <[email protected]>
AuthorDate: 2024-05-30 13:59:09 +0000
Commit:     Kristof Provost <[email protected]>
CommitDate: 2024-07-02 07:45:53 +0000

    cxgbe: handle vlan PF restrictions
    
    Co-Authored-by: Navdeep Parhar <[email protected]>
    MFC after:      2 weeks
    Sponsored by:   Orange Business Services
    Differential Revision:  https://reviews.freebsd.org/D45428
    
    (cherry picked from commit 1389314d53531e06c7ec02406b0addf7d77e7db7)
---
 sys/dev/cxgbe/common/t4_hw.c |  7 ++++---
 sys/dev/cxgbe/t4_iov.c       | 37 +++++++++++++++++++++++++++++++++----
 2 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/sys/dev/cxgbe/common/t4_hw.c b/sys/dev/cxgbe/common/t4_hw.c
index c18243e4b681..c428fd2720cd 100644
--- a/sys/dev/cxgbe/common/t4_hw.c
+++ b/sys/dev/cxgbe/common/t4_hw.c
@@ -11466,7 +11466,7 @@ out:
  *     @vlan: The vlanid to be set
  *
  */
-int t4_set_vlan_acl(struct adapter *adap, unsigned int mbox, unsigned int vf,
+int t4_set_vlan_acl(struct adapter *adap, unsigned int pf, unsigned int vf,
                    u16 vlan)
 {
        struct fw_acl_vlan_cmd vlan_cmd;
@@ -11478,9 +11478,10 @@ int t4_set_vlan_acl(struct adapter *adap, unsigned int 
mbox, unsigned int vf,
                                         F_FW_CMD_REQUEST |
                                         F_FW_CMD_WRITE |
                                         F_FW_CMD_EXEC |
-                                        V_FW_ACL_VLAN_CMD_PFN(adap->pf) |
+                                        V_FW_ACL_VLAN_CMD_PFN(pf) |
                                         V_FW_ACL_VLAN_CMD_VFN(vf));
-       vlan_cmd.en_to_len16 = cpu_to_be32(enable | FW_LEN16(vlan_cmd));
+       vlan_cmd.en_to_len16 = cpu_to_be32(enable | FW_LEN16(vlan_cmd) |
+                                          V_FW_ACL_VLAN_CMD_PMASK(1 << pf));
        /* Drop all packets that donot match vlan id */
        vlan_cmd.dropnovlan_fm = (enable
                                  ? (F_FW_ACL_VLAN_CMD_DROPNOVLAN |
diff --git a/sys/dev/cxgbe/t4_iov.c b/sys/dev/cxgbe/t4_iov.c
index b063bda233b9..6409f3e3f994 100644
--- a/sys/dev/cxgbe/t4_iov.c
+++ b/sys/dev/cxgbe/t4_iov.c
@@ -30,8 +30,12 @@
 #include <sys/bus.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
+#include <sys/socket.h>
 #include <sys/systm.h>
+#include <sys/iov.h>
 #include <dev/pci/pcivar.h>
+#include <net/if.h>
+#include <net/if_vlan_var.h>
 
 #ifdef PCI_IOV
 #include <sys/nv.h>
@@ -258,6 +262,7 @@ t4iov_attach_child(device_t dev)
        pf_schema = pci_iov_schema_alloc_node();
        vf_schema = pci_iov_schema_alloc_node();
        pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
+       pci_iov_schema_add_vlan(vf_schema, "vlan", 0, 0);
        error = pci_iov_attach_name(dev, pf_schema, vf_schema, "%s",
            device_get_nameunit(pdev));
        if (error) {
@@ -337,14 +342,15 @@ t4iov_add_vf(device_t dev, uint16_t vfnum, const struct 
nvlist *config)
        size_t size;
        int rc;
 
+       sc = device_get_softc(dev);
+       MPASS(sc->sc_attached);
+       MPASS(sc->sc_main != NULL);
+       adap = device_get_softc(sc->sc_main);
+
        if (nvlist_exists_binary(config, "mac-addr")) {
                mac = nvlist_get_binary(config, "mac-addr", &size);
                bcopy(mac, ma, ETHER_ADDR_LEN);
 
-               sc = device_get_softc(dev);
-               MPASS(sc->sc_attached);
-               MPASS(sc->sc_main != NULL);
-               adap = device_get_softc(sc->sc_main);
                if (begin_synchronized_op(adap, NULL, SLEEP_OK | INTR_OK,
                    "t4vfma") != 0)
                        return (ENXIO);
@@ -359,6 +365,29 @@ t4iov_add_vf(device_t dev, uint16_t vfnum, const struct 
nvlist *config)
                }
        }
 
+       if (nvlist_exists_number(config, "vlan")) {
+               uint16_t vlan = nvlist_get_number(config, "vlan");
+
+               /* We can't restrict to VID 0 */
+               if (vlan == 0)
+                       return (ENOTSUP);
+
+               if (vlan == VF_VLAN_TRUNK)
+                       vlan = 0;
+
+               if (begin_synchronized_op(adap, NULL, SLEEP_OK | INTR_OK,
+                   "t4vfvl") != 0)
+                       return (ENXIO);
+               rc = t4_set_vlan_acl(adap, sc->pf, vfnum + 1, vlan);
+               end_synchronized_op(adap, 0);
+               if (rc != 0) {
+                       device_printf(dev,
+                           "Failed to set VF%d VLAN to %d, rc = %d\n",
+                           vfnum, vlan, rc);
+                       return (rc);
+               }
+       }
+
        return (0);
 }
 #endif

Reply via email to