Date: Fri, 3 May 2019 20:05:31 +0000 (UTC) From: Matt Macy <mmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r347057 - head/sys/net Message-ID: <201905032005.x43K5Vdo050070@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mmacy Date: Fri May 3 20:05:31 2019 New Revision: 347057 URL: https://svnweb.freebsd.org/changeset/base/347057 Log: Allow iflib drivers to pass a pointer to their own ifmedia structure. Tested by: emaste@ Differential Revision: https://reviews.freebsd.org/D19946 Modified: head/sys/net/iflib.c head/sys/net/iflib.h Modified: head/sys/net/iflib.c ============================================================================== --- head/sys/net/iflib.c Fri May 3 17:23:08 2019 (r347056) +++ head/sys/net/iflib.c Fri May 3 20:05:31 2019 (r347057) @@ -182,6 +182,7 @@ struct iflib_ctx { struct grouptask ifc_vflr_task; struct iflib_filter_info ifc_filter_info; struct ifmedia ifc_media; + struct ifmedia *ifc_mediap; struct sysctl_oid *ifc_sysctl_node; uint16_t ifc_sysctl_ntxqs; @@ -238,7 +239,7 @@ struct ifmedia * iflib_get_media(if_ctx_t ctx) { - return (&ctx->ifc_media); + return (ctx->ifc_mediap); } uint32_t @@ -4184,7 +4185,7 @@ iflib_if_ioctl(if_t ifp, u_long command, caddr_t data) /* falls thru */ case SIOCGIFMEDIA: case SIOCGIFXMEDIA: - err = ifmedia_ioctl(ifp, ifr, &ctx->ifc_media, command); + err = ifmedia_ioctl(ifp, ifr, ctx->ifc_mediap, command); break; case SIOCGI2C: { @@ -4583,6 +4584,9 @@ iflib_device_register(device_t dev, void *sc, if_share _iflib_pre_assert(scctx); ctx->ifc_txrx = *scctx->isc_txrx; + if (sctx->isc_flags & IFLIB_DRIVER_MEDIA) + ctx->ifc_mediap = scctx->isc_media; + #ifdef INVARIANTS if (scctx->isc_capabilities & IFCAP_TXCSUM) MPASS(scctx->isc_tx_csum_flags); @@ -4819,9 +4823,9 @@ iflib_pseudo_register(device_t dev, if_shared_ctx_t sc device_printf(dev, "IFDI_CLONEATTACH failed %d\n", err); goto fail_ctx_free; } - ifmedia_add(&ctx->ifc_media, IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL); - ifmedia_add(&ctx->ifc_media, IFM_ETHER | IFM_AUTO, 0, NULL); - ifmedia_set(&ctx->ifc_media, IFM_ETHER | IFM_AUTO); + ifmedia_add(ctx->ifc_mediap, IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL); + ifmedia_add(ctx->ifc_mediap, IFM_ETHER | IFM_AUTO, 0, NULL); + ifmedia_set(ctx->ifc_mediap, IFM_ETHER | IFM_AUTO); #ifdef INVARIANTS if (scctx->isc_capabilities & IFCAP_TXCSUM) @@ -5348,9 +5352,11 @@ iflib_register(if_ctx_t ctx) EVENTHANDLER_REGISTER(vlan_unconfig, iflib_vlan_unregister, ctx, EVENTHANDLER_PRI_FIRST); - ifmedia_init(&ctx->ifc_media, IFM_IMASK, - iflib_media_change, iflib_media_status); - + if ((sctx->isc_flags & IFLIB_DRIVER_MEDIA) == 0) { + ctx->ifc_mediap = &ctx->ifc_media; + ifmedia_init(ctx->ifc_mediap, IFM_IMASK, + iflib_media_change, iflib_media_status); + } return (0); } Modified: head/sys/net/iflib.h ============================================================================== --- head/sys/net/iflib.h Fri May 3 17:23:08 2019 (r347056) +++ head/sys/net/iflib.h Fri May 3 20:05:31 2019 (r347057) @@ -228,8 +228,10 @@ typedef struct if_softc_ctx { pci_vendor_info_t isc_vendor_info; /* set by iflib prior to attach_pre */ int isc_disable_msix; if_txrx_t isc_txrx; + struct ifmedia *isc_media; } *if_softc_ctx_t; + /* * Initialization values for device */ @@ -361,6 +363,10 @@ typedef enum { * Interface needs admin task to ignore interface up/down status */ #define IFLIB_ADMIN_ALWAYS_RUN 0x10000 +/* + * Driver will pass the media + */ +#define IFLIB_DRIVER_MEDIA 0x20000 /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201905032005.x43K5Vdo050070>