Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Apr 2015 22:30:56 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r282044 - projects/ifnet/sys/dev/cxgbe
Message-ID:  <201504262230.t3QMUu80004856@svn.freebsd.org>

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

Log:
  Convert cxgbe(4) to new ifmedia KPI.
  
  Not tested.
  
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/ifnet/sys/dev/cxgbe/adapter.h
  projects/ifnet/sys/dev/cxgbe/t4_main.c
  projects/ifnet/sys/dev/cxgbe/t4_tracer.c

Modified: projects/ifnet/sys/dev/cxgbe/adapter.h
==============================================================================
--- projects/ifnet/sys/dev/cxgbe/adapter.h	Sun Apr 26 22:29:21 2015	(r282043)
+++ projects/ifnet/sys/dev/cxgbe/adapter.h	Sun Apr 26 22:30:55 2015	(r282044)
@@ -49,7 +49,6 @@
 #include <sys/sysctl.h>
 #include <net/ethernet.h>
 #include <net/if.h>
-#include <net/if_media.h>
 #include <netinet/in.h>
 #include <netinet/tcp_lro.h>
 
@@ -219,7 +218,6 @@ struct port_info {
 	struct adapter *adapter;
 
 	if_t ifp;
-	struct ifmedia media;
 
 	struct mtx pi_lock;
 	char lockname[16];
@@ -259,7 +257,6 @@ struct port_info {
 	int first_nm_rxq;	/* index of first netmap rx queue */
 
 	if_t nm_ifp;
-	struct ifmedia nm_media;
 	int nmif_flags;
 	uint16_t nm_viid;
 	int16_t nm_xact_addr_filt;
@@ -766,7 +763,6 @@ struct adapter {
 	char ifp_lockname[16];
 	struct mtx ifp_lock;
 	struct ifnet *ifp;	/* tracer ifp */
-	struct ifmedia media;
 	int traceq;		/* iq used by all tracers, -1 if none */
 	int tracer_valid;	/* bitmap of valid tracers */
 	int tracer_enabled;	/* bitmap of enabled tracers */

Modified: projects/ifnet/sys/dev/cxgbe/t4_main.c
==============================================================================
--- projects/ifnet/sys/dev/cxgbe/t4_main.c	Sun Apr 26 22:29:21 2015	(r282043)
+++ projects/ifnet/sys/dev/cxgbe/t4_main.c	Sun Apr 26 22:30:55 2015	(r282044)
@@ -154,7 +154,7 @@ static int cxgbe_transmit(if_t, struct m
 static void cxgbe_qflush(if_t);
 static uint64_t cxgbe_get_counter(if_t, ift_counter);
 static void cxgbe_vlan_event(if_t, uint16_t, if_t);
-static int cxgbe_media_change(if_t);
+static int cxgbe_media_change(if_t, if_media_t);
 static void cxgbe_media_status(if_t, struct ifmediareq *);
 
 static struct iftsomax cxgbe_tsomax = {
@@ -163,6 +163,38 @@ static struct iftsomax cxgbe_tsomax = {
 	.tsomax_segsize = 65536,
 };
 
+static if_media_t cxgbe_media_xfi[] = {
+	IFM_ETHER | IFM_AUTO,
+	IFM_ETHER | IFM_FDX | IFM_10G_T,
+	IFM_ETHER | IFM_FDX | IFM_1000_T,
+	IFM_ETHER | IFM_FDX | IFM_100_TX, 0
+};
+static if_media_t cxgbe_media_sgmii[] = {
+	IFM_ETHER | IFM_AUTO,
+	IFM_ETHER | IFM_FDX | IFM_1000_T,
+	IFM_ETHER | IFM_FDX | IFM_100_TX, 0
+};
+static if_media_t cxgbe_media_cx4[] = {
+	IFM_ETHER | IFM_FDX | IFM_10G_CX4, 0 };
+static if_media_t cxgbe_media_lr[] = {
+	IFM_ETHER | IFM_FDX | IFM_10G_LR, 0 };
+static if_media_t cxgbe_media_sr[] = {
+	IFM_ETHER | IFM_FDX | IFM_10G_SR, 0 };
+static if_media_t cxgbe_media_lrm[] = {
+	IFM_ETHER | IFM_FDX | IFM_10G_LRM, 0 };
+static if_media_t cxgbe_media_twinax[] = {
+	IFM_ETHER | IFM_FDX | IFM_10G_TWINAX, 0 };
+static if_media_t cxgbe_media_lr4[] = {
+	IFM_ETHER | IFM_FDX | IFM_40G_LR4, 0 };
+static if_media_t cxgbe_media_sr4[] = {
+	IFM_ETHER | IFM_FDX | IFM_40G_SR4, 0 };
+static if_media_t cxgbe_media_cr4[] = {
+	IFM_ETHER | IFM_FDX | IFM_40G_CR4, 0 };
+static if_media_t cxgbe_media_none[] = {
+	IFM_ETHER | IFM_NONE, 0 };
+static if_media_t cxgbe_media_unknown[] = {
+	IFM_ETHER | IFM_FDX | IFM_UNKNOWN, 0 };
+
 static struct ifdriver cxgbe_ifdrv = {
 	.ifdrv_ops = {
 		.ifop_origin = IFOP_ORIGIN_DRIVER,
@@ -171,6 +203,8 @@ static struct ifdriver cxgbe_ifdrv = {
 		.ifop_qflush = cxgbe_qflush,
 		.ifop_get_counter = cxgbe_get_counter,
 		.ifop_vlan_event = cxgbe_vlan_event,
+		.ifop_media_change = cxgbe_media_change,
+		.ifop_media_status = cxgbe_media_status,
 	},
 	.ifdrv_name = "cxgbe",
 	.ifdrv_type = IFT_ETHER,
@@ -396,7 +430,7 @@ static int get_params__pre_init(struct a
 static int get_params__post_init(struct adapter *);
 static int set_params__post_init(struct adapter *);
 static void t4_set_desc(struct adapter *);
-static void build_medialist(struct port_info *, struct ifmedia *);
+static if_media_t * choose_mediae(struct port_info *);
 static int cxgbe_init_synchronized(struct port_info *);
 static int cxgbe_uninit_synchronized(struct port_info *);
 static int setup_intr_handlers(struct adapter *);
@@ -1103,11 +1137,6 @@ cxgbe_attach(device_t dev)
 
 	callout_init(&pi->tick, CALLOUT_MPSAFE);
 
-	/* Initialize ifmedia for this port */
-	ifmedia_init(&pi->media, IFM_IMASK, cxgbe_media_change,
-	    cxgbe_media_status);
-	build_medialist(pi, &pi->media);
-
 	n = 128;
 	s = malloc(n, M_CXGBE, M_WAITOK);
 	o = snprintf(s, n, "%d txq, %d rxq (NIC)", pi->ntxq, pi->nrxq);
@@ -1134,14 +1163,12 @@ cxgbe_attach(device_t dev)
 	ifat.ifat_lla = pi->hw_addr;
 	ifat.ifat_softc = pi;
 	ifat.ifat_dunit = device_get_unit(dev);
+	ifat.ifat_mediae = choose_mediae(pi);
+	ifat.ifat_media = ifat.ifat_mediae[0];
 	pi->ifp = if_attach(&ifat);
 	if_setsoftc(pi->ifp, IF_CXGBE_PORT, pi);
 
 #ifdef DEV_NETMAP
-	/* nm_media handled here to keep implementation private to this file */
-	ifmedia_init(&pi->nm_media, IFM_IMASK, cxgbe_media_change,
-	    cxgbe_media_status);
-	build_medialist(pi, &pi->nm_media);
 	create_netmap_ifnet(pi);	/* logs errors it something fails */
 #endif
 	cxgbe_sysctls(pi);
@@ -1182,7 +1209,6 @@ cxgbe_detach(device_t dev)
 	cxgbe_uninit_synchronized(pi);
 	port_full_uninit(pi);
 
-	ifmedia_removeall(&pi->media);
 	if_detach(pi->ifp);
 
 #ifdef DEV_NETMAP
@@ -1317,11 +1343,6 @@ fail:
 		end_synchronized_op(sc, 0);
 		break;
 
-	case SIOCSIFMEDIA:
-	case SIOCGIFMEDIA:
-		ifmedia_ioctl(ifp, ifr, &pi->media, cmd);
-		break;
-
 	case SIOCGI2C: {
 		struct ifi2creq i2c;
 
@@ -1471,7 +1492,7 @@ cxgbe_get_counter(if_t ifp, ift_counter 
 }
 
 static int
-cxgbe_media_change(if_t ifp)
+cxgbe_media_change(if_t ifp, if_media_t media)
 {
 	struct port_info *pi = if_getsoftc(ifp, IF_DRIVER_SOFTC);
 
@@ -1484,23 +1505,7 @@ static void
 cxgbe_media_status(if_t ifp, struct ifmediareq *ifmr)
 {
 	struct port_info *pi = if_getsoftc(ifp, IF_DRIVER_SOFTC);
-	struct ifmedia *media = NULL;
-	struct ifmedia_entry *cur;
 	int speed = pi->link_cfg.speed;
-#ifdef INVARIANTS
-	int data = (pi->port_type << 8) | pi->mod_type;
-#endif
-
-	if (ifp == pi->ifp)
-		media = &pi->media;
-#ifdef DEV_NETMAP
-	else if (ifp == pi->nm_ifp)
-		media = &pi->nm_media;
-#endif
-	MPASS(media != NULL);
-
-	cur = media->ifm_cur;
-	MPASS(cur->ifm_data == data);
 
 	ifmr->ifm_status = IFM_AVALID;
 	if (!pi->link_cfg.link_ok)
@@ -1509,7 +1514,7 @@ cxgbe_media_status(if_t ifp, struct ifme
 	ifmr->ifm_status |= IFM_ACTIVE;
 
 	/* active and current will differ iff current media is autoselect. */
-	if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
+	if (IFM_SUBTYPE(ifmr->ifm_current) != IFM_AUTO)
 		return;
 
 	ifmr->ifm_active = IFM_ETHER | IFM_FDX;
@@ -2797,35 +2802,20 @@ t4_set_desc(struct adapter *sc)
 	device_set_desc_copy(sc->dev, buf);
 }
 
-static void
-build_medialist(struct port_info *pi, struct ifmedia *media)
+static if_media_t *
+choose_mediae(struct port_info *pi)
 {
-	int data, m;
-
-	PORT_LOCK(pi);
-
-	ifmedia_removeall(media);
-
-	m = IFM_ETHER | IFM_FDX;
-	data = (pi->port_type << 8) | pi->mod_type;
 
 	switch(pi->port_type) {
 	case FW_PORT_TYPE_BT_XFI:
 	case FW_PORT_TYPE_BT_XAUI:
-		ifmedia_add(media, m | IFM_10G_T, data, NULL);
-		/* fall through */
+		return (cxgbe_media_xfi);
 
 	case FW_PORT_TYPE_BT_SGMII:
-		ifmedia_add(media, m | IFM_1000_T, data, NULL);
-		ifmedia_add(media, m | IFM_100_TX, data, NULL);
-		ifmedia_add(media, IFM_ETHER | IFM_AUTO, data, NULL);
-		ifmedia_set(media, IFM_ETHER | IFM_AUTO);
-		break;
+		return (cxgbe_media_sgmii);
 
 	case FW_PORT_TYPE_CX4:
-		ifmedia_add(media, m | IFM_10G_CX4, data, NULL);
-		ifmedia_set(media, m | IFM_10G_CX4);
-		break;
+		return (cxgbe_media_cx4);
 
 	case FW_PORT_TYPE_QSFP_10G:
 	case FW_PORT_TYPE_SFP:
@@ -2834,89 +2824,48 @@ build_medialist(struct port_info *pi, st
 		switch (pi->mod_type) {
 
 		case FW_PORT_MOD_TYPE_LR:
-			ifmedia_add(media, m | IFM_10G_LR, data, NULL);
-			ifmedia_set(media, m | IFM_10G_LR);
-			break;
+			return (cxgbe_media_lr);
 
 		case FW_PORT_MOD_TYPE_SR:
-			ifmedia_add(media, m | IFM_10G_SR, data, NULL);
-			ifmedia_set(media, m | IFM_10G_SR);
-			break;
+			return (cxgbe_media_sr);
 
 		case FW_PORT_MOD_TYPE_LRM:
-			ifmedia_add(media, m | IFM_10G_LRM, data, NULL);
-			ifmedia_set(media, m | IFM_10G_LRM);
-			break;
+			return (cxgbe_media_lrm);
 
 		case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
 		case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
-			ifmedia_add(media, m | IFM_10G_TWINAX, data, NULL);
-			ifmedia_set(media, m | IFM_10G_TWINAX);
-			break;
+			return (cxgbe_media_twinax);
 
 		case FW_PORT_MOD_TYPE_NONE:
-			m &= ~IFM_FDX;
-			ifmedia_add(media, m | IFM_NONE, data, NULL);
-			ifmedia_set(media, m | IFM_NONE);
-			break;
+			return (cxgbe_media_none);
 
 		case FW_PORT_MOD_TYPE_NA:
 		case FW_PORT_MOD_TYPE_ER:
 		default:
-			device_printf(pi->dev,
-			    "unknown port_type (%d), mod_type (%d)\n",
-			    pi->port_type, pi->mod_type);
-			ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
-			ifmedia_set(media, m | IFM_UNKNOWN);
-			break;
+			return (cxgbe_media_unknown);
 		}
-		break;
-
 	case FW_PORT_TYPE_QSFP:
 		switch (pi->mod_type) {
 
 		case FW_PORT_MOD_TYPE_LR:
-			ifmedia_add(media, m | IFM_40G_LR4, data, NULL);
-			ifmedia_set(media, m | IFM_40G_LR4);
-			break;
+			return (cxgbe_media_lr4);
 
 		case FW_PORT_MOD_TYPE_SR:
-			ifmedia_add(media, m | IFM_40G_SR4, data, NULL);
-			ifmedia_set(media, m | IFM_40G_SR4);
-			break;
+			return (cxgbe_media_sr4);
 
 		case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
 		case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
-			ifmedia_add(media, m | IFM_40G_CR4, data, NULL);
-			ifmedia_set(media, m | IFM_40G_CR4);
-			break;
+			return (cxgbe_media_cr4);
 
 		case FW_PORT_MOD_TYPE_NONE:
-			m &= ~IFM_FDX;
-			ifmedia_add(media, m | IFM_NONE, data, NULL);
-			ifmedia_set(media, m | IFM_NONE);
-			break;
+			return (cxgbe_media_none);
 
 		default:
-			device_printf(pi->dev,
-			    "unknown port_type (%d), mod_type (%d)\n",
-			    pi->port_type, pi->mod_type);
-			ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
-			ifmedia_set(media, m | IFM_UNKNOWN);
-			break;
+			return (cxgbe_media_unknown);
 		}
-		break;
-
 	default:
-		device_printf(pi->dev,
-		    "unknown port_type (%d), mod_type (%d)\n", pi->port_type,
-		    pi->mod_type);
-		ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
-		ifmedia_set(media, m | IFM_UNKNOWN);
-		break;
+		return (cxgbe_media_unknown);
 	}
-
-	PORT_UNLOCK(pi);
 }
 
 struct mc_addr_ctx {
@@ -7879,10 +7828,12 @@ t4_os_portmod_changed(const struct adapt
 	static const char *mod_str[] = {
 		NULL, "LR", "SR", "ER", "TWINAX", "active TWINAX", "LRM"
 	};
+	if_media_t *newmediae;
 
-	build_medialist(pi, &pi->media);
+	newmediae = choose_mediae(pi);
+	if_media_change(pi->ifp, newmediae, newmediae[0]);
 #ifdef DEV_NETMAP
-	build_medialist(pi, &pi->nm_media);
+	if_media_change(pi->nm_ifp, newmediae, newmediae[0]);
 #endif
 
 	if (pi->mod_type == FW_PORT_MOD_TYPE_NONE)

Modified: projects/ifnet/sys/dev/cxgbe/t4_tracer.c
==============================================================================
--- projects/ifnet/sys/dev/cxgbe/t4_tracer.c	Sun Apr 26 22:29:21 2015	(r282043)
+++ projects/ifnet/sys/dev/cxgbe/t4_tracer.c	Sun Apr 26 22:30:55 2015	(r282044)
@@ -85,12 +85,16 @@ static struct sx t4_trace_lock;
 
 /* tracer interface ops.  mostly no-ops. */
 static int tracer_ioctl(if_t, unsigned long, void *, struct thread *);
-static int tracer_media_change(if_t);
+static int tracer_media_change(if_t, if_media_t);
 static void tracer_media_status(if_t, struct ifmediareq *);
 
+static if_media_t tracer_mediae[] = { IFM_ETHER | IFM_FDX | IFM_NONE, 0 };
+
 static struct ifdriver t4_tracer_ifdrv = {
 	.ifdrv_ops = {
 		.ifop_ioctl = tracer_ioctl,
+		.ifop_media_change = tracer_media_change,
+		.ifop_media_status = tracer_media_status,
 	},
 	.ifdrv_name = "tXnex",
 	.ifdrv_type = IFT_ETHER,
@@ -145,6 +149,8 @@ t4_cloner_create(struct if_clone *ifc, c
 		.ifat_flags = IFF_SIMPLEX,
 		.ifat_capabilities = IFCAP_JUMBO_MTU | IFCAP_VLAN_MTU,
 		.ifat_lla = lla,
+		.ifat_mediae = tracer_mediae,
+		.ifat_media = tracer_mediae[0],
 	};
 	struct match_rr mrr;
 	struct adapter *sc;
@@ -179,11 +185,6 @@ t4_cloner_create(struct if_clone *ifc, c
 	ifat.ifat_softc = sc;
 	ifp = if_attach(&ifat);
 
-	ifmedia_init(&sc->media, IFM_IMASK, tracer_media_change,
-	    tracer_media_status);
-	ifmedia_add(&sc->media, IFM_ETHER | IFM_FDX | IFM_NONE, 0, NULL);
-	ifmedia_set(&sc->media, IFM_ETHER | IFM_FDX | IFM_NONE);
-
 	mtx_lock(&sc->ifp_lock);
 	sc->ifp = ifp;
 	mtx_unlock(&sc->ifp_lock);
@@ -204,7 +205,6 @@ t4_cloner_destroy(struct if_clone *ifc, 
 		mtx_lock(&sc->ifp_lock);
 		sc->ifp = NULL;
 		mtx_unlock(&sc->ifp_lock);
-		ifmedia_removeall(&sc->media);
 	}
 	if_detach(ifp);
 	sx_xunlock(&t4_trace_lock);
@@ -249,7 +249,6 @@ t4_tracer_port_detach(struct adapter *sc
 		sc->ifp = NULL;
 		mtx_unlock(&sc->ifp_lock);
 	}
-	ifmedia_removeall(&sc->media);
 	sx_xunlock(&t4_trace_lock);
 }
 
@@ -435,9 +434,6 @@ t5_trace_pkt(struct sge_iq *iq, const st
 static int
 tracer_ioctl(if_t ifp, unsigned long cmd, void *data, struct thread *td)
 {
-	int rc = 0;
-	struct adapter *sc;
-	struct ifreq *ifr = (struct ifreq *)data;
 
 	switch (cmd) {
 	case SIOCSIFMTU:
@@ -445,26 +441,14 @@ tracer_ioctl(if_t ifp, unsigned long cmd
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:
 	case SIOCSIFCAP:
-		break;
-	case SIOCSIFMEDIA:
-	case SIOCGIFMEDIA:
-		sx_xlock(&t4_trace_lock);
-		sc = if_getsoftc(ifp, IF_DRIVER_SOFTC);
-		if (sc == NULL)
-			rc = EIO;
-		else
-			rc = ifmedia_ioctl(ifp, ifr, &sc->media, cmd);
-		sx_xunlock(&t4_trace_lock);
-		break;
+		return (0);
 	default:
-		rc = EOPNOTSUPP;
+		return (EOPNOTSUPP);
 	}
-
-	return (rc);
 }
 
 static int
-tracer_media_change(if_t ifp)
+tracer_media_change(if_t ifp, if_media_t media)
 {
 
 	return (EOPNOTSUPP);



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