Index: sys/dev/virtio/network/if_vtnet.c =================================================================== --- sys/dev/virtio/network/if_vtnet.c +++ sys/dev/virtio/network/if_vtnet.c @@ -938,6 +938,7 @@ ifmedia_init(&sc->vtnet_media, IFM_IMASK, vtnet_ifmedia_upd, vtnet_ifmedia_sts); ifmedia_add(&sc->vtnet_media, VTNET_MEDIATYPE, 0, NULL); + ifmedia_add(&sc->vtnet_media, IFM_ETHER_SUBTYPE_SET(IFM_VFAST), 0, NULL); ifmedia_set(&sc->vtnet_media, VTNET_MEDIATYPE); /* Read (or generate) the MAC address for the adapter. */ Index: sys/net/if_media.h =================================================================== --- sys/net/if_media.h +++ sys/net/if_media.h @@ -129,6 +129,8 @@ * Ethernet */ #define IFM_ETHER 0x00000020 +#define IFM_ETHER_SUBTYPE_SET(x) (((x) & 0x1f) | (((x) & 0x3e0) << 6) | IFM_ETHER) +#define IFM_ETHER_SUBTYPE_GET(x) (((x) & 0x1f) | (((x) & 0xf800) >> 6)) #define IFM_10_T 3 /* 10BaseT - RJ45 */ #define IFM_10_2 4 /* 10Base2 - Thinnet */ #define IFM_10_5 5 /* 10Base5 - AUI */ @@ -156,11 +158,32 @@ #define IFM_40G_CR4 27 /* 40GBase-CR4 */ #define IFM_40G_SR4 28 /* 40GBase-SR4 */ #define IFM_40G_LR4 29 /* 40GBase-LR4 */ +#define IFM_VFAST 30 /* test "V.fast" */ +#define IFM_1000_KX 31 /* 1000Base-KX backplane */ +#define IFM_10G_KX4 32 /* 10GBase-KX4 backplane */ +#define IFM_10G_KR 33 /* 10GBase-KR backplane */ +#define IFM_10G_CR1 34 /* 10GBase-CR1 Twinax splitter */ +#define IFM_20G_KR2 35 /* 20GBase-KR2 backplane */ +#define IFM_2500_KX 36 /* 2500Base-KX backplane */ +#define IFM_2500_T 37 /* 2500Base-T - RJ45 (NBaseT) */ +#define IFM_5000_T 38 /* 5000Base-T - RJ45 (NBaseT) */ +#define IFM_50G_PCIE 39 /* 50G Ethernet over PCIE */ +#define IFM_25G_PCIE 40 /* 25G Ethernet over PCIE */ +#define IFM_SGMII 41 /* 1G media interface */ +#define IFM_SFI 42 /* 10G media interface */ +#define IFM_XLPPI 43 /* 40G media interface */ +#define IFM_1000_CX_SGMII 44 /* 1000Base-CX-SGMII */ +#define IFM_40G_KR4 45 /* 40GBase-KR4 */ +#define IFM_10G_ER 46 /* 10GBase-ER */ +#define IFM_100G_CR4 47 /* 100GBase-CR4 */ +#define IFM_100G_SR4 48 /* 100GBase-SR4 */ +#define IFM_100G_KR4 49 /* 100GBase-KR4 */ + /* * Please update ieee8023ad_lacp.c:lacp_compose_key() * after adding new Ethernet media types. */ -/* note 31 is the max! */ +/* Note 0x3ff is the max! */ #define IFM_ETH_MASTER 0x00000100 /* master mode (1000baseT) */ #define IFM_ETH_RXPAUSE 0x00000200 /* receive PAUSE frames */ @@ -307,7 +330,10 @@ * Macros to extract various bits of information from the media word. */ #define IFM_TYPE(x) ((x) & IFM_NMASK) -#define IFM_SUBTYPE(x) ((x) & IFM_TMASK) +#define IFM_SUBTYPE(x) \ + (IFM_TYPE(x) == IFM_ETHER ? IFM_ETHER_SUBTYPE_GET(x) : ((x) & IFM_TMASK)) +#define IFM_TYPE_MATCH(x,y) \ + (IFM_TYPE(x) == IFM_TYPE(y) && IFM_SUBTYPE(x) == IFM_SUBTYPE(y)) #define IFM_TYPE_OPTIONS(x) ((x) & IFM_OMASK) #define IFM_INST(x) (((x) & IFM_IMASK) >> IFM_ISHIFT) #define IFM_OPTIONS(x) ((x) & (IFM_OMASK | IFM_GMASK)) @@ -372,6 +398,26 @@ { IFM_40G_CR4, "40Gbase-CR4" }, \ { IFM_40G_SR4, "40Gbase-SR4" }, \ { IFM_40G_LR4, "40Gbase-LR4" }, \ + { IFM_VFAST, "V.fast" }, \ + { IFM_1000_KX, "1000Base-KX" }, \ + { IFM_10G_KX4, "10GBase-KX4" }, \ + { IFM_10G_KR, "10GBase-KR" }, \ + { IFM_10G_CR1, "10GBase-CR1" }, \ + { IFM_20G_KR2, "20GBase-KR2" }, \ + { IFM_2500_KX, "2500Base-KX" }, \ + { IFM_2500_T, "2500Base-T" }, \ + { IFM_5000_T, "5000Base-T" }, \ + { IFM_50G_PCIE, "PCIExpress-50G" }, \ + { IFM_25G_PCIE, "PCIExpress-25G" }, \ + { IFM_SGMII, "SGMII" }, \ + { IFM_SFI, "SFI" }, \ + { IFM_XLPPI, "XLPPI" }, \ + { IFM_1000_CX_SGMII, "1000Base-CX-SGMII" }, \ + { IFM_40G_KR4, "40GBase-KR4" }, \ + { IFM_10G_ER, "10GBase-ER" }, \ + { IFM_100G_CR4, "100GBase-CR4" }, \ + { IFM_100G_SR4, "100GBase-SR4" }, \ + { IFM_100G_KR4, "100GBase-KR4" }, \ { 0, NULL }, \ } @@ -673,6 +719,26 @@ { IFM_ETHER | IFM_40G_CR4, IF_Gbps(40ULL) }, \ { IFM_ETHER | IFM_40G_SR4, IF_Gbps(40ULL) }, \ { IFM_ETHER | IFM_40G_LR4, IF_Gbps(40ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_VFAST), IF_Gbps(40ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_1000_KX), IF_Mbps(1000) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_10G_KX4), IF_Gbps(10ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_10G_KR), IF_Gbps(10ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_10G_CR1), IF_Gbps(10ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_20G_KR2), IF_Gbps(20ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_2500_KX), IF_Mbps(2500) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_2500_T), IF_Mbps(2500) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_5000_T), IF_Mbps(5000) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_50G_PCIE), IF_Gbps(50ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_25G_PCIE), IF_Gbps(25ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_SGMII), IF_Mbps(1000) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_SFI), IF_Gbps(10ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_XLPPI), IF_Gbps(40ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_1000_CX_SGMII), IF_Mbps(1000) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_40G_KR4), IF_Gbps(40ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_10G_ER), IF_Gbps(10ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_100G_CR4), IF_Gbps(100ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_100G_SR4), IF_Gbps(100ULL) }, \ + { IFM_ETHER_SUBTYPE_SET(IFM_100G_KR4), IF_Gbps(100ULL) }, \ \ { IFM_TOKEN | IFM_TOK_STP4, IF_Mbps(4) }, \ { IFM_TOKEN | IFM_TOK_STP16, IF_Mbps(16) }, \ Index: sys/net/if_media.c =================================================================== --- sys/net/if_media.c +++ sys/net/if_media.c @@ -354,8 +354,7 @@ int i; for (i = 0; ifmedia_baudrate_descriptions[i].ifmb_word != 0; i++) { - if ((mword & (IFM_NMASK|IFM_TMASK)) == - ifmedia_baudrate_descriptions[i].ifmb_word) + if (IFM_TYPE_MATCH(mword, ifmedia_baudrate_descriptions[i].ifmb_word)) return (ifmedia_baudrate_descriptions[i].ifmb_baudrate); }