diff options
| -rw-r--r-- | sys/dev/e1000/if_em.c | 1 | ||||
| -rw-r--r-- | sys/dev/e1000/if_igb_iov.c | 58 | ||||
| -rw-r--r-- | sys/dev/e1000/if_igb_iov.h | 1 |
3 files changed, 60 insertions, 0 deletions
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c index 44c5ec7a850c..d9db4677bf62 100644 --- a/sys/dev/e1000/if_em.c +++ b/sys/dev/e1000/if_em.c @@ -665,6 +665,7 @@ static device_method_t igb_if_methods[] = { DEVMETHOD(ifdi_iov_init, igb_if_iov_init), DEVMETHOD(ifdi_iov_uninit, igb_if_iov_uninit), DEVMETHOD(ifdi_iov_vf_add, igb_if_iov_vf_add), + DEVMETHOD(ifdi_vf_status, igb_if_vf_status), #endif DEVMETHOD_END }; diff --git a/sys/dev/e1000/if_igb_iov.c b/sys/dev/e1000/if_igb_iov.c index dc4b23397431..e62ca8aa029c 100644 --- a/sys/dev/e1000/if_igb_iov.c +++ b/sys/dev/e1000/if_igb_iov.c @@ -1996,6 +1996,64 @@ igb_iov_validate(struct e1000_softc *sc, u16 num_vfs) } int +igb_if_vf_status(if_ctx_t ctx, nvlist_t *status) +{ + struct e1000_softc *sc; + struct igb_vf *vf; + nvlist_t **vfs; + u_int num_queues; + int error, i; + + sc = iflib_get_softc(ctx); + if (sc->num_vfs == 0) + return (ENXIO); + num_queues = sc->hw.mac.type == e1000_82576 ? + IGB_82576_VF_QUEUES : IGB_I350_VF_QUEUES; + vfs = mallocarray(sc->num_vfs, sizeof(*vfs), M_IGB_IOV, + M_WAITOK | M_ZERO); + for (i = 0; i < sc->num_vfs; i++) { + vf = &sc->vfs[i]; + vfs[i] = nvlist_create(0); + nvlist_add_number(vfs[i], IFVF_STATUS_INDEX, i); + nvlist_add_bool(vfs[i], IFVF_STATUS_CONFIGURED, + (vf->flags & IGB_VF_ACTIVE) != 0); + nvlist_add_bool(vfs[i], IFVF_STATUS_INITIALIZED, + (vf->flags & IGB_VF_CTS) != 0); + nvlist_add_binary(vfs[i], IFVF_STATUS_MAC, vf->mac, + ETHER_ADDR_LEN); + if (vf->default_vlan == 0) + nvlist_add_string(vfs[i], IFVF_STATUS_VLAN_MODE, + IFVF_VLAN_MODE_TRUNK); + else { + nvlist_add_string(vfs[i], IFVF_STATUS_VLAN_MODE, + IFVF_VLAN_MODE_ACCESS); + nvlist_add_number(vfs[i], IFVF_STATUS_VLAN, + vf->default_vlan); + } + nvlist_add_number(vfs[i], IFVF_STATUS_VLAN_COUNT, + vf->vlan_count); + nvlist_add_number(vfs[i], IFVF_STATUS_NUM_QUEUES, num_queues); + nvlist_add_bool(vfs[i], IFVF_STATUS_ALLOW_SET_MAC, + (vf->flags & IGB_VF_CAP_MAC) != 0); + nvlist_add_bool(vfs[i], IFVF_STATUS_ALLOW_SET_VLAN, + vf->default_vlan == 0); + nvlist_add_bool(vfs[i], IFVF_STATUS_MAC_ANTI_SPOOF, + (vf->flags & IGB_VF_MAC_ANTI_SPOOF) != 0); + nvlist_add_bool(vfs[i], IFVF_STATUS_ALLOW_PROMISC, + (vf->flags & IGB_VF_ALLOW_PROMISC) != 0); + nvlist_add_bool(vfs[i], IFVF_STATUS_MDD_BLOCKED, + (vf->flags & IGB_VF_MDD_BLOCKED) != 0); + } + nvlist_add_nvlist_array(status, IFVF_STATUS_VFS, + (const nvlist_t * const *)vfs, sc->num_vfs); + error = nvlist_error(status); + for (i = 0; i < sc->num_vfs; i++) + nvlist_destroy(vfs[i]); + free(vfs, M_IGB_IOV); + return (error); +} + +int igb_if_iov_init(if_ctx_t ctx, u16 num_vfs, const nvlist_t *config) { struct e1000_softc *sc; diff --git a/sys/dev/e1000/if_igb_iov.h b/sys/dev/e1000/if_igb_iov.h index 8bd576d47649..390e63175c7a 100644 --- a/sys/dev/e1000/if_igb_iov.h +++ b/sys/dev/e1000/if_igb_iov.h @@ -24,6 +24,7 @@ int igb_iov_validate(struct e1000_softc *, u16); int igb_if_iov_init(if_ctx_t, u16, const nvlist_t *); void igb_if_iov_uninit(if_ctx_t); int igb_if_iov_vf_add(if_ctx_t, u16, const nvlist_t *); +int igb_if_vf_status(if_ctx_t, nvlist_t *); void igb_iov_initialize(struct e1000_softc *); void igb_iov_handle_mbx(struct e1000_softc *); void igb_iov_handle_mdd(struct e1000_softc *); |
