Skip site navigation (1)Skip section navigation (2)
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>