From owner-svn-src-projects@FreeBSD.ORG Sun Apr 26 22:30:56 2015 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id CDF67244; Sun, 26 Apr 2015 22:30:56 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id BC8C819F8; Sun, 26 Apr 2015 22:30:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t3QMUuWD004859; Sun, 26 Apr 2015 22:30:56 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t3QMUu80004856; Sun, 26 Apr 2015 22:30:56 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201504262230.t3QMUu80004856@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Sun, 26 Apr 2015 22:30:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r282044 - projects/ifnet/sys/dev/cxgbe X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Apr 2015 22:30:56 -0000 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 #include #include -#include #include #include @@ -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);