mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
cxgbe: handle vlan PF restrictions
Co-Authored-by: Navdeep Parhar <np@FreeBSD.org> MFC after: 2 weeks Sponsored by: Orange Business Services Differential Revision: https://reviews.freebsd.org/D45428
This commit is contained in:
parent
2d6094615a
commit
1389314d53
|
@ -11377,7 +11377,7 @@ int t4_configure_ringbb(struct adapter *adap)
|
||||||
* @vlan: The vlanid to be set
|
* @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)
|
u16 vlan)
|
||||||
{
|
{
|
||||||
struct fw_acl_vlan_cmd vlan_cmd;
|
struct fw_acl_vlan_cmd vlan_cmd;
|
||||||
|
@ -11389,9 +11389,10 @@ int t4_set_vlan_acl(struct adapter *adap, unsigned int mbox, unsigned int vf,
|
||||||
F_FW_CMD_REQUEST |
|
F_FW_CMD_REQUEST |
|
||||||
F_FW_CMD_WRITE |
|
F_FW_CMD_WRITE |
|
||||||
F_FW_CMD_EXEC |
|
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));
|
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 */
|
/* Drop all packets that donot match vlan id */
|
||||||
vlan_cmd.dropnovlan_fm = (enable
|
vlan_cmd.dropnovlan_fm = (enable
|
||||||
? (F_FW_ACL_VLAN_CMD_DROPNOVLAN |
|
? (F_FW_ACL_VLAN_CMD_DROPNOVLAN |
|
||||||
|
|
|
@ -29,8 +29,12 @@
|
||||||
#include <sys/bus.h>
|
#include <sys/bus.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
#include <sys/module.h>
|
#include <sys/module.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
#include <sys/iov.h>
|
||||||
#include <dev/pci/pcivar.h>
|
#include <dev/pci/pcivar.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <net/if_vlan_var.h>
|
||||||
|
|
||||||
#ifdef PCI_IOV
|
#ifdef PCI_IOV
|
||||||
#include <sys/nv.h>
|
#include <sys/nv.h>
|
||||||
|
@ -257,6 +261,7 @@ t4iov_attach_child(device_t dev)
|
||||||
pf_schema = pci_iov_schema_alloc_node();
|
pf_schema = pci_iov_schema_alloc_node();
|
||||||
vf_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_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",
|
error = pci_iov_attach_name(dev, pf_schema, vf_schema, "%s",
|
||||||
device_get_nameunit(pdev));
|
device_get_nameunit(pdev));
|
||||||
if (error) {
|
if (error) {
|
||||||
|
@ -336,14 +341,15 @@ t4iov_add_vf(device_t dev, uint16_t vfnum, const struct nvlist *config)
|
||||||
size_t size;
|
size_t size;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
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);
|
sc = device_get_softc(dev);
|
||||||
MPASS(sc->sc_attached);
|
MPASS(sc->sc_attached);
|
||||||
MPASS(sc->sc_main != NULL);
|
MPASS(sc->sc_main != NULL);
|
||||||
adap = device_get_softc(sc->sc_main);
|
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);
|
||||||
|
|
||||||
if (begin_synchronized_op(adap, NULL, SLEEP_OK | INTR_OK,
|
if (begin_synchronized_op(adap, NULL, SLEEP_OK | INTR_OK,
|
||||||
"t4vfma") != 0)
|
"t4vfma") != 0)
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
|
@ -358,6 +364,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 == DOT1Q_VID_NULL)
|
||||||
|
return (ENOTSUP);
|
||||||
|
|
||||||
|
if (vlan == VF_VLAN_TRUNK)
|
||||||
|
vlan = DOT1Q_VID_NULL;
|
||||||
|
|
||||||
|
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);
|
return (0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue