From owner-svn-src-projects@FreeBSD.ORG Sun Apr 26 22:29:22 2015 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 453B2148; Sun, 26 Apr 2015 22:29:22 +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 340BB19E8; Sun, 26 Apr 2015 22:29:22 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t3QMTM7I004517; Sun, 26 Apr 2015 22:29:22 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t3QMTLso004511; Sun, 26 Apr 2015 22:29:21 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201504262229.t3QMTLso004511@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:29:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r282043 - projects/ifnet/sys/dev/e1000 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:29:22 -0000 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 #include #include -#include #ifdef RSS #include #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;