Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Apr 2015 22:29:21 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r282043 - projects/ifnet/sys/dev/e1000
Message-ID:  <201504262229.t3QMTLso004511@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Sun Apr 26 22:29:21 2015
New Revision: 282043
URL: https://svnweb.freebsd.org/changeset/base/282043

Log:
  Convert igb(4) to new ifmedia KPI.
  
  Functional changes:
  o If e1000_check_reset_block(&adapter->hw) != 0, then return EBUSY,
    instead of doing nothing and returning no error.
  
  Tested:		E1000_DEV_ID_I210_COPPER
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/ifnet/sys/dev/e1000/if_igb.c
  projects/ifnet/sys/dev/e1000/if_igb.h

Modified: projects/ifnet/sys/dev/e1000/if_igb.c
==============================================================================
--- projects/ifnet/sys/dev/e1000/if_igb.c	Sun Apr 26 21:47:15 2015	(r282042)
+++ projects/ifnet/sys/dev/e1000/if_igb.c	Sun Apr 26 22:29:21 2015	(r282043)
@@ -67,7 +67,6 @@
 #include <net/ethernet.h>
 #include <net/if.h>
 #include <net/if_dl.h>
-#include <net/if_media.h>
 #ifdef	RSS
 #include <net/rss_config.h>
 #endif
@@ -195,7 +194,7 @@ static uint64_t	igb_get_counter(if_t, if
 static void	igb_init(struct adapter *);
 static void	igb_stop(void *);
 static void	igb_media_status(if_t, struct ifmediareq *);
-static int	igb_media_change(if_t);
+static int	igb_media_change(if_t, if_media_t);
 static void	igb_identify_hardware(struct adapter *);
 static int	igb_allocate_pci_resources(struct adapter *);
 static int	igb_allocate_msix(struct adapter *);
@@ -304,12 +303,33 @@ static driver_t igb_driver = {
 	"igb", igb_methods, sizeof(struct adapter),
 };
 
+static if_media_t igb_media_fiber[] = {
+	IFM_ETHER | IFM_1000_SX | IFM_FDX,
+	IFM_ETHER | IFM_1000_SX,
+	IFM_ETHER | IFM_AUTO, 0 };
+static if_media_t igb_media_ife[] = {
+	IFM_ETHER | IFM_10_T,
+	IFM_ETHER | IFM_10_T | IFM_FDX,
+	IFM_ETHER | IFM_100_TX,
+	IFM_ETHER | IFM_100_TX | IFM_FDX,
+	IFM_ETHER | IFM_AUTO, 0 };
+static if_media_t igb_media_copper[] = {
+	IFM_ETHER | IFM_10_T,
+	IFM_ETHER | IFM_10_T | IFM_FDX,
+	IFM_ETHER | IFM_100_TX,
+	IFM_ETHER | IFM_100_TX | IFM_FDX,
+	IFM_ETHER | IFM_1000_T | IFM_FDX,
+	IFM_ETHER | IFM_1000_T,
+	IFM_ETHER | IFM_AUTO, 0 };
+
 static struct ifdriver igb_ifdrv = {
 	.ifdrv_ops = {
 		.ifop_ioctl = igb_ioctl,
 		.ifop_get_counter = igb_get_counter,
 		.ifop_transmit = igb_mq_start,
 		.ifop_qflush = igb_qflush,
+		.ifop_media_change = igb_media_change,
+		.ifop_media_status = igb_media_status,
 #ifdef DEVICE_POLLING
 		.ifop_poll = igb_poll,
 #endif
@@ -1060,21 +1080,6 @@ igb_ioctl(if_t ifp, u_long command, void
 			IGB_CORE_UNLOCK(adapter);
 		}
 		break;
-	case SIOCSIFMEDIA:
-		/* Check SOL/IDER usage */
-		IGB_CORE_LOCK(adapter);
-		if (e1000_check_reset_block(&adapter->hw)) {
-			IGB_CORE_UNLOCK(adapter);
-			device_printf(adapter->dev, "Media change is"
-			    " blocked due to SOL/IDER session.\n");
-			break;
-		}
-		IGB_CORE_UNLOCK(adapter);
-	case SIOCGIFMEDIA:
-		IOCTL_DEBUGOUT("ioctl rcv'd: \
-		    SIOCxIFMEDIA (Get/Set Interface Media)");
-		error = ifmedia_ioctl(ifp, ifr, &adapter->media, command);
-		break;
 	case SIOCSIFCAP:
 		IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFCAP (Set Capabilities)");
 		mask = ifr->ifr_reqcap ^ ifr->ifr_curcap;
@@ -1561,18 +1566,25 @@ igb_media_status(if_t ifp, struct ifmedi
  *
  **********************************************************************/
 static int
-igb_media_change(if_t ifp)
+igb_media_change(if_t ifp, if_media_t media)
 {
 	struct adapter *adapter = if_getsoftc(ifp, IF_DRIVER_SOFTC);
-	struct ifmedia  *ifm = &adapter->media;
 
 	INIT_DEBUGOUT("igb_media_change: begin");
 
-	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
+	if (IFM_TYPE(media) != IFM_ETHER)
 		return (EINVAL);
 
+	/* Check SOL/IDER usage */
 	IGB_CORE_LOCK(adapter);
-	switch (IFM_SUBTYPE(ifm->ifm_media)) {
+	if (e1000_check_reset_block(&adapter->hw)) {
+		IGB_CORE_UNLOCK(adapter);
+		device_printf(adapter->dev, "Media change is"
+		    " blocked due to SOL/IDER session.\n");
+		return (EBUSY);
+	}
+
+	switch (IFM_SUBTYPE(media)) {
 	case IFM_AUTO:
 		adapter->hw.mac.autoneg = DO_AUTO_NEG;
 		adapter->hw.phy.autoneg_advertised = AUTONEG_ADV_DEFAULT;
@@ -1586,7 +1598,7 @@ igb_media_change(if_t ifp)
 	case IFM_100_TX:
 		adapter->hw.mac.autoneg = FALSE;
 		adapter->hw.phy.autoneg_advertised = 0;
-		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
+		if ((media & IFM_GMASK) == IFM_FDX)
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_100_FULL;
 		else
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_100_HALF;
@@ -1594,7 +1606,7 @@ igb_media_change(if_t ifp)
 	case IFM_10_T:
 		adapter->hw.mac.autoneg = FALSE;
 		adapter->hw.phy.autoneg_advertised = 0;
-		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
+		if ((media & IFM_GMASK) == IFM_FDX)
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_10_FULL;
 		else
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_10_HALF;
@@ -2945,6 +2957,7 @@ igb_setup_interface(device_t dev, struct
 #endif
 		    IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO |
 		    IFCAP_VLAN_HWFILTER,
+		.ifat_media = IFM_ETHER | IFM_AUTO,
 	};
 
 	INIT_DEBUGOUT("igb_setup_interface: begin");
@@ -2965,36 +2978,18 @@ igb_setup_interface(device_t dev, struct
 	    ifat.ifat_capabilities &
 	    ~(IFCAP_LRO | IFCAP_VLAN_HWFILTER | IFCAP_POLLING);
 
-	adapter->ifp = if_attach(&ifat);
-
 	/*
-	 * Specify the media types supported by this adapter and register
-	 * callbacks to update media and link information
+	 * Specify the media types supported by this adapter.
 	 */
-	ifmedia_init(&adapter->media, IFM_IMASK,
-	    igb_media_change, igb_media_status);
 	if ((adapter->hw.phy.media_type == e1000_media_type_fiber) ||
-	    (adapter->hw.phy.media_type == e1000_media_type_internal_serdes)) {
-		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX | IFM_FDX, 
-			    0, NULL);
-		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
-	} else {
-		ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
-		ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T | IFM_FDX,
-			    0, NULL);
-		ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX,
-			    0, NULL);
-		ifmedia_add(&adapter->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
-			    0, NULL);
-		if (adapter->hw.phy.type != e1000_phy_ife) {
-			ifmedia_add(&adapter->media,
-				IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
-			ifmedia_add(&adapter->media,
-				IFM_ETHER | IFM_1000_T, 0, NULL);
-		}
-	}
-	ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
-	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
+	    (adapter->hw.phy.media_type == e1000_media_type_internal_serdes))
+		ifat.ifat_mediae = igb_media_fiber;
+	else if (adapter->hw.phy.type == e1000_phy_ife)
+		ifat.ifat_mediae = igb_media_ife;
+	else
+		ifat.ifat_mediae = igb_media_copper;
+
+	adapter->ifp = if_attach(&ifat);
 }
 
 

Modified: projects/ifnet/sys/dev/e1000/if_igb.h
==============================================================================
--- projects/ifnet/sys/dev/e1000/if_igb.h	Sun Apr 26 21:47:15 2015	(r282042)
+++ projects/ifnet/sys/dev/e1000/if_igb.h	Sun Apr 26 22:29:21 2015	(r282043)
@@ -382,7 +382,6 @@ struct adapter {
 	void			*tag;
 	struct resource 	*res;
 
-	struct ifmedia		media;
 	struct callout		timer;
 	int			msix;
 	u32			if_flags;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504262229.t3QMTLso004511>