svn commit: r282044 - projects/ifnet/sys/dev/cxgbe
Gleb Smirnoff
glebius at FreeBSD.org
Sun Apr 26 22:30:56 UTC 2015
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);
More information about the svn-src-projects
mailing list