From nobody Sat Jun 13 11:01:28 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3305D2494D8; Fri, 8 May 2026 03:48:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212128; cv=none; b=IV3nNdIf3heb62V/SIo386C62BdAkrlOxWlmB0TLaYv4bgypR6HoRfwNoy+VM48HzFjwdvIH1bjofWOmkMPD6joRmLcJa8WFLrsfvodGIokm6+dARkQvtA2f8jkRzrolopEFPWlVE4cl9xILwXUEiOmBGqoJHyA8x26X63BP4M4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212128; c=relaxed/simple; bh=IysmtrfEnBl2FAT/X43D4kfZ0H/PNoYdWVnFXWlv2xE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tfb/etFf3BPaI4O695v9oxbDAYO8DFAYGiehY3qApYmdfZwmKCgChe21xJOStMBOvqMv2Trr9CtrGc32MuvsgcOBtEHL/sPP1DDVPQlgbREvk3t5etOALubMD2LPG+8UMO+dF0P0geMmlZVI4Ge/XjAceoJ+0hO7ZElk+6kL1UQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=RXRry30o; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="RXRry30o" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1778212128; x=1809748128; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IysmtrfEnBl2FAT/X43D4kfZ0H/PNoYdWVnFXWlv2xE=; b=RXRry30oxlfyQ51PH0RZpsjl1iupkmD2W9/aIiQGAJXbP6h2/S4uDZ55 LxaQA+gQjhFY/+XlTvc4ihQpND4yGbNiRqPTPzCQtzs1Pv52Hkk1v7VOg MEJryy678v6aYEluJmwygx4as87JMItebPe0F+QcMW7afZm01uXSdvYuB fb3DrvEguwyns/14+AqMC3eZ0jrwX2iMiMKY4/jvgRZPDXOCoa88K6HF+ MSVDJZA7HQFjidlA9Byal5elEOERVuRB2pE3EMZFP0HBt9TP4vAv1NQFt J8hMWUmdr4E2TTtGVrXhSnHXI8II4eOfK2WTLNqxs8Eb2ND3WenxSFnlP g==; X-CSE-ConnectionGUID: XK8IfYE0Tq+neRVSC1Xdqw== X-CSE-MsgGUID: DPL9ZhrURrOfrP73ZhTDww== X-IronPort-AV: E=McAfee;i="6800,10657,11779"; a="90278856" X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="90278856" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 May 2026 20:48:47 -0700 X-CSE-ConnectionGUID: ZVbTtdOBSTy5opvJ/1Lc1w== X-CSE-MsgGUID: vUBzAKXPTDuBEzWjQE7hLQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="236767299" Received: from unknown (HELO localhost.png.intel.com) ([10.107.255.61]) by orviesa009.jf.intel.com with ESMTP; 07 May 2026 20:48:42 -0700 From: KhaiWenTan To: anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, faizal.abdul.rahim@intel.com, hong.aun.looi@intel.com, hector.blanco.alcaine@intel.com, khai.wen.tan@intel.com, Faizal Rahim , Aleksandr Loktionov , Khai Wen Tan Subject: [PATCH iwl-next v5 1/4] igc: remove unused autoneg_failed field Date: Fri, 8 May 2026 05:47:03 +0800 Message-ID: <20260507214706.309984-2-khai.wen.tan@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> References: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Faizal Rahim autoneg_failed in struct igc_mac_info is never set in the igc driver. Remove the field and the dead code checking it in igc_config_fc_after_link_up(). The field originates from the e1000/e1000e fiber/serdes forced-link path, where MAC-level autoneg timeout sets it to signal the flow-control code to force pause. igc supports only copper, so it never needs to set this field. Reviewed-by: Looi Hong Aun Reviewed-by: Aleksandr Loktionov Signed-off-by: Faizal Rahim Signed-off-by: Khai Wen Tan Reviewed-by: Simon Horman --- drivers/net/ethernet/intel/igc/igc_hw.h | 1 - drivers/net/ethernet/intel/igc/igc_mac.c | 16 +--------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_hw.h b/drivers/net/ethernet= /intel/igc/igc_hw.h index be8a49a86d09..86ab8f566f44 100644 --- a/drivers/net/ethernet/intel/igc/igc_hw.h +++ b/drivers/net/ethernet/intel/igc/igc_hw.h @@ -92,7 +92,6 @@ struct igc_mac_info { bool asf_firmware_present; bool arc_subsystem_valid; =20 - bool autoneg_failed; bool get_link_status; }; =20 diff --git a/drivers/net/ethernet/intel/igc/igc_mac.c b/drivers/net/etherne= t/intel/igc/igc_mac.c index 7ac6637f8db7..142beb9ae557 100644 --- a/drivers/net/ethernet/intel/igc/igc_mac.c +++ b/drivers/net/ethernet/intel/igc/igc_mac.c @@ -438,28 +438,14 @@ void igc_config_collision_dist(struct igc_hw *hw) * Checks the status of auto-negotiation after link up to ensure that the * speed and duplex were not forced. If the link needed to be forced, then * flow control needs to be forced also. If auto-negotiation is enabled - * and did not fail, then we configure flow control based on our link - * partner. + * then we configure flow control based on our link partner. */ s32 igc_config_fc_after_link_up(struct igc_hw *hw) { u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg; - struct igc_mac_info *mac =3D &hw->mac; u16 speed, duplex; s32 ret_val =3D 0; =20 - /* Check for the case where we have fiber media and auto-neg failed - * so we had to force link. In this case, we need to force the - * configuration of the MAC to match the "fc" parameter. - */ - if (mac->autoneg_failed) - ret_val =3D igc_force_mac_fc(hw); - - if (ret_val) { - hw_dbg("Error forcing flow control settings\n"); - goto out; - } - /* In auto-neg, we need to check and see if Auto-Neg has completed, * and if so, how the PHY and link partner has flow control * configured. --=20 2.43.0 From nobody Sat Jun 13 11:01:28 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F3A1A2494D8; Fri, 8 May 2026 03:48:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212135; cv=none; b=XprnrfGG5XXMTtD+9rLb6p3y3/77UQIU2gJMpaajgfya1YCRaO+2mFROb7XCecfSvT8rwX7e+sZ/KsJfdWmYlTHR6ger9nAdmFVmCyXD9nYdrpswUAFcDHKeP9TeMyr+DXf0nW3qnNhJwhWTh+xkFvS82rGKgIg3SJPu8qmViJM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212135; c=relaxed/simple; bh=OzVx/xeWQnGHVkDtrIL36NcQb5HsBgwSnA/5p4iz8DI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Py1Xj4dqNVXMYmap8XnvEfZuOKuGQyrDVNaTK2zgduGGji8ruMwBZX+Pc3PemhabPrOmbknLb8lJpj+awRgA2c3u5RjNu3dsCv613RU/vqnw/4mnzg9QcITXq6qaByO1wulscXe42628CO3vlro0GBE64juasLVbZ4I8IceOsCk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=lw3QG+6w; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="lw3QG+6w" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1778212134; x=1809748134; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=OzVx/xeWQnGHVkDtrIL36NcQb5HsBgwSnA/5p4iz8DI=; b=lw3QG+6wFiICA0jEV7HbKMOQiL/st1MUtZEQjuPu+OzdT9AuSXP3LlLG bSARNpicdILAnoOI70OQJmBKv7vMa3hN3apwdcCbhP9zzZxbCPs94vZQS 9eFxdRDTMJ0KN7P2WFsR00DHXTjVJzUN22+D0+jNsXwXfFv/Abhy+4dgI FBiNNF7tcsKalu/5clbd2aQZ4+QOB0teafIrz/ojSBeaBWqyv5YZh+kBe KgFpTDQ7kJGHfpIGL9BocsDNunljviyFQKOYakPyIQFHrTZsZL3dRaGNk 30fgmD2QcZzAqbRjtN7xSKe67UjHD3q6Zc4Cdpp3kkZwggy6olT41AWHx g==; X-CSE-ConnectionGUID: 7QoI4tNXSsaPOtTRaqqw0g== X-CSE-MsgGUID: UwiumiPWSPGZQNW+o5sWuQ== X-IronPort-AV: E=McAfee;i="6800,10657,11779"; a="90278875" X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="90278875" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 May 2026 20:48:54 -0700 X-CSE-ConnectionGUID: X/QL0LFtS2Kapf7mTNXiKA== X-CSE-MsgGUID: cxCc4oY6RE6NTtsN3b8B8w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="236767311" Received: from unknown (HELO localhost.png.intel.com) ([10.107.255.61]) by orviesa009.jf.intel.com with ESMTP; 07 May 2026 20:48:49 -0700 From: KhaiWenTan To: anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, faizal.abdul.rahim@intel.com, hong.aun.looi@intel.com, hector.blanco.alcaine@intel.com, khai.wen.tan@intel.com, Faizal Rahim , Aleksandr Loktionov , Khai Wen Tan Subject: [PATCH iwl-next v5 2/4] igc: move autoneg-enabled settings into igc_handle_autoneg_enabled() Date: Fri, 8 May 2026 05:47:04 +0800 Message-ID: <20260507214706.309984-3-khai.wen.tan@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> References: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Faizal Rahim Move the advertised link modes and flow control configuration from igc_ethtool_set_link_ksettings() into igc_handle_autoneg_enabled(). No functional change. Reviewed-by: Looi Hong Aun Reviewed-by: Aleksandr Loktionov Signed-off-by: Faizal Rahim Signed-off-by: Khai Wen Tan Reviewed-by: Simon Horman --- drivers/net/ethernet/intel/igc/igc_ethtool.c | 72 ++++++++++++-------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/eth= ernet/intel/igc/igc_ethtool.c index 0122009bedd0..cfcbf2fdad6e 100644 --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c @@ -2000,6 +2000,49 @@ static int igc_ethtool_get_link_ksettings(struct net= _device *netdev, return 0; } =20 +/** + * igc_handle_autoneg_enabled - Configure autonegotiation advertisement + * @adapter: private driver structure + * @cmd: ethtool link ksettings from user + * + * Records advertised speeds and flow control settings when autoneg + * is enabled. + */ +static void igc_handle_autoneg_enabled(struct igc_adapter *adapter, + const struct ethtool_link_ksettings *cmd) +{ + struct igc_hw *hw =3D &adapter->hw; + u16 advertised =3D 0; + + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, + 2500baseT_Full)) + advertised |=3D ADVERTISE_2500_FULL; + + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, + 1000baseT_Full)) + advertised |=3D ADVERTISE_1000_FULL; + + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, + 100baseT_Full)) + advertised |=3D ADVERTISE_100_FULL; + + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, + 100baseT_Half)) + advertised |=3D ADVERTISE_100_HALF; + + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, + 10baseT_Full)) + advertised |=3D ADVERTISE_10_FULL; + + if (ethtool_link_ksettings_test_link_mode(cmd, advertising, + 10baseT_Half)) + advertised |=3D ADVERTISE_10_HALF; + + hw->phy.autoneg_advertised =3D advertised; + if (adapter->fc_autoneg) + hw->fc.requested_mode =3D igc_fc_default; +} + static int igc_ethtool_set_link_ksettings(struct net_device *netdev, const struct ethtool_link_ksettings *cmd) @@ -2007,7 +2050,6 @@ igc_ethtool_set_link_ksettings(struct net_device *net= dev, struct igc_adapter *adapter =3D netdev_priv(netdev); struct net_device *dev =3D adapter->netdev; struct igc_hw *hw =3D &adapter->hw; - u16 advertised =3D 0; =20 /* When adapter in resetting mode, autoneg/speed/duplex * cannot be changed @@ -2032,34 +2074,8 @@ igc_ethtool_set_link_ksettings(struct net_device *ne= tdev, while (test_and_set_bit(__IGC_RESETTING, &adapter->state)) usleep_range(1000, 2000); =20 - if (ethtool_link_ksettings_test_link_mode(cmd, advertising, - 2500baseT_Full)) - advertised |=3D ADVERTISE_2500_FULL; - - if (ethtool_link_ksettings_test_link_mode(cmd, advertising, - 1000baseT_Full)) - advertised |=3D ADVERTISE_1000_FULL; - - if (ethtool_link_ksettings_test_link_mode(cmd, advertising, - 100baseT_Full)) - advertised |=3D ADVERTISE_100_FULL; - - if (ethtool_link_ksettings_test_link_mode(cmd, advertising, - 100baseT_Half)) - advertised |=3D ADVERTISE_100_HALF; - - if (ethtool_link_ksettings_test_link_mode(cmd, advertising, - 10baseT_Full)) - advertised |=3D ADVERTISE_10_FULL; - - if (ethtool_link_ksettings_test_link_mode(cmd, advertising, - 10baseT_Half)) - advertised |=3D ADVERTISE_10_HALF; - if (cmd->base.autoneg =3D=3D AUTONEG_ENABLE) { - hw->phy.autoneg_advertised =3D advertised; - if (adapter->fc_autoneg) - hw->fc.requested_mode =3D igc_fc_default; + igc_handle_autoneg_enabled(adapter, cmd); } else { netdev_info(dev, "Force mode currently not supported\n"); } --=20 2.43.0 From nobody Sat Jun 13 11:01:28 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E2EF256C6C; Fri, 8 May 2026 03:49:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212141; cv=none; b=FV9oT51qNhxnkbeXt+OlKI5yP5JYaCnuqEGT6Wxc1HkMbuyBZIxyvWy1s5EcVRHswVkl11VExJoqeE389dZVGgUyRlV61VGqpmGmQJ7ZUBGtF3VdqBg5UU24lLLrXWZrSvOG43x/snvFN/h/+1RSLJQOYHEbEvRxq7wRJ+pnOyo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212141; c=relaxed/simple; bh=NEze/O911ldqimOh6WbrfXYQde70TWMivjIbXg4pGRg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qyQCnvu4HUD5Qxnl7KD+3yejqo2ZAnX/rGKpUeCk52rlPWOtDo4Dtd5H1ExqHBIuqBkbrWU0i9jBiFLcsjrOhWNTbXbRS0DDQ2Vc4GxWIHrRI2p+Z9bb/rdsa7/BhMEJ4BpzxnATF8ci76tnKvlJkoJPgApE/Mo8XLQInvSHulI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Y7TME5/o; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Y7TME5/o" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1778212141; x=1809748141; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=NEze/O911ldqimOh6WbrfXYQde70TWMivjIbXg4pGRg=; b=Y7TME5/oLV7E8prgRReK9D35coR8FT9pvy+n7RkCUho0Iep+LbsbOHtl +bLNt08bLIAz0YfmFTLP8r7oUA9GnhzQvEXMof5OyKupFRwGodA2GygaD UlfENghhIU+0emNpojA/p7ZHytsoXwEM2uEaQEzdzeefh/8uxtt3a3ZEK APpWU/crhs9sPFZo0oLPT7ZJVj4y0X13zr3+cZPO0b7l0d51ECvi12P+n 8G1335B7naIsZRr8q9/3v48FEoK9lJzoin8UbmshL/9ateWbRr4TllL0w 5lSLe21V7ACbU0dwYwgNTO8ot1kRn53Wlfok/a5KVytWITBiZWnZqE2FW g==; X-CSE-ConnectionGUID: C7/OVAmHQImt5oZEeyzABQ== X-CSE-MsgGUID: v+FsUucMTZySz4lJoRDQiw== X-IronPort-AV: E=McAfee;i="6800,10657,11779"; a="90278907" X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="90278907" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 May 2026 20:49:00 -0700 X-CSE-ConnectionGUID: tQz1KoGLSv6V5FnKrJZ9Kw== X-CSE-MsgGUID: SJDb0zO8T0SRoBK3KiyUXA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="236767321" Received: from unknown (HELO localhost.png.intel.com) ([10.107.255.61]) by orviesa009.jf.intel.com with ESMTP; 07 May 2026 20:48:56 -0700 From: KhaiWenTan To: anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, faizal.abdul.rahim@intel.com, hong.aun.looi@intel.com, hector.blanco.alcaine@intel.com, khai.wen.tan@intel.com, Faizal Rahim , Khai Wen Tan Subject: [PATCH iwl-next v5 3/4] igc: replace goto out with direct returns in igc_config_fc_after_link_up() Date: Fri, 8 May 2026 05:47:05 +0800 Message-ID: <20260507214706.309984-4-khai.wen.tan@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> References: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Faizal Rahim The out: label only returns ret_val with no cleanup. The kernel coding style guide states: "If there is no cleanup needed then just return directly." (Documentation/process/coding-style.rst, section 7). This improves readability ahead of a subsequent patch that introduces a new goto label in this function. No functional change. Reviewed-by: Looi Hong Aun Signed-off-by: Faizal Rahim Signed-off-by: Khai Wen Tan Reviewed-by: Simon Horman --- drivers/net/ethernet/intel/igc/igc_mac.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_mac.c b/drivers/net/etherne= t/intel/igc/igc_mac.c index 142beb9ae557..0a3d3f357505 100644 --- a/drivers/net/ethernet/intel/igc/igc_mac.c +++ b/drivers/net/ethernet/intel/igc/igc_mac.c @@ -458,15 +458,15 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw) ret_val =3D hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); if (ret_val) - goto out; + return ret_val; ret_val =3D hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg); if (ret_val) - goto out; + return ret_val; =20 if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) { hw_dbg("Copper PHY and Auto Neg has not completed.\n"); - goto out; + return ret_val; } =20 /* The AutoNeg process has completed, so we now need to @@ -478,11 +478,11 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw) ret_val =3D hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg); if (ret_val) - goto out; + return ret_val; ret_val =3D hw->phy.ops.read_reg(hw, PHY_LP_ABILITY, &mii_nway_lp_ability_reg); if (ret_val) - goto out; + return ret_val; /* Two bits in the Auto Negotiation Advertisement Register * (Address 4) and two bits in the Auto Negotiation Base * Page Ability Register (Address 5) determine flow control @@ -598,7 +598,7 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw) ret_val =3D hw->mac.ops.get_speed_and_duplex(hw, &speed, &duplex); if (ret_val) { hw_dbg("Error getting link speed and duplex\n"); - goto out; + return ret_val; } =20 if (duplex =3D=3D HALF_DUPLEX) @@ -610,10 +610,9 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw) ret_val =3D igc_force_mac_fc(hw); if (ret_val) { hw_dbg("Error forcing flow control settings\n"); - goto out; + return ret_val; } =20 -out: return ret_val; } =20 --=20 2.43.0 From nobody Sat Jun 13 11:01:28 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.13]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0AA8F314D2D; Fri, 8 May 2026 03:49:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.13 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212147; cv=none; b=GSXjnMKRx/zLv48PQ1sGtxyYyjsaqQl9djTSgHkvHUFv7ojNDrqqmd5SOe5b3UwLa634jgxEuH8ldu/CMdXESqIpg2FBI07mWsUM2EoFVOXlx+tbuRv0q9d6seHRn90NKk+50noZ7DGw9Pdn3B1MZKiRRmAgvQZ8QFQusDdnAKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778212147; c=relaxed/simple; bh=gae6y7EJBuj8Jto0vsYeQMGUIbgjeayhUzWJyBq3IXo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TnC6M4FWbRCWD3ngc9CEVEO3VbA3FPhyFGSmKf8IBlaykJNLR9HHkACHvLu3PXEsgW+wFWp3l3yEH4rHc9dgNd5YwEP020BWJJ5N1yz/cHybRDK8UcF6zSyexYjyX8UJteLP2UoHCTOtJQZVh9dp7sgavLMZaSkGpQAN7e9TPgk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=AdE8+1ih; arc=none smtp.client-ip=198.175.65.13 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="AdE8+1ih" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1778212146; x=1809748146; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=gae6y7EJBuj8Jto0vsYeQMGUIbgjeayhUzWJyBq3IXo=; b=AdE8+1ihd12w06SBZkw2c0sC2HeVFlZCrjneycry8m6wCzLYhdXRvEgZ 4f8UuaxSomANUvygewei0h5laZZLRMHKnPyOB7E8Dma5HtcaLwqjl2JRY GU51rG4Xs5VNrYIwG+/TFjT0CNHpL/Ww9eVQz4HesPwgMwgIHrt2EOti/ 1lEXa1EiF3bdvLNFM+GV9U/3VQ/itik37zYywDRbbnA029MZvYGwdCak9 3/Lt/z6sWyRCFrr3hq1h599r0nYG+HiqzL3PlId2iMpgl0izbEFmoVI81 Zon9fgdS0WdFK/mjRGRUmOAlur/lt8qxZ8NjXEDuURyTXd1SL9c3Irpzm Q==; X-CSE-ConnectionGUID: pfzNkf0+QFu38wCmub98Og== X-CSE-MsgGUID: IM7WWvPrTeWrCBmA04UhEg== X-IronPort-AV: E=McAfee;i="6800,10657,11779"; a="90278918" X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="90278918" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 May 2026 20:49:06 -0700 X-CSE-ConnectionGUID: FseTsGffTVqdXt2g3ANTqw== X-CSE-MsgGUID: b6X/zdHbTqaZ9xLkNF1Xlw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,222,1770624000"; d="scan'208";a="236767331" Received: from unknown (HELO localhost.png.intel.com) ([10.107.255.61]) by orviesa009.jf.intel.com with ESMTP; 07 May 2026 20:49:01 -0700 From: KhaiWenTan To: anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: intel-wired-lan@lists.osuosl.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, faizal.abdul.rahim@intel.com, hong.aun.looi@intel.com, hector.blanco.alcaine@intel.com, khai.wen.tan@intel.com, Faizal Rahim , Khai Wen Tan Subject: [PATCH iwl-next v5 4/4] igc: add support for forcing link speed without autonegotiation Date: Fri, 8 May 2026 05:47:06 +0800 Message-ID: <20260507214706.309984-5-khai.wen.tan@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> References: <20260507214706.309984-1-khai.wen.tan@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Faizal Rahim Allow users to force 10/100 Mb/s link speed and duplex via ethtool when autonegotiation is disabled. Previously, the driver rejected these requests with "Force mode currently not supported.". Forcing at 1000 Mb/s and 2500 Mb/s is not supported. Reviewed-by: Looi Hong Aun Signed-off-by: Faizal Rahim Signed-off-by: Khai Wen Tan Reviewed-by: Simon Horman --- drivers/net/ethernet/intel/igc/igc_base.c | 35 ++++- drivers/net/ethernet/intel/igc/igc_defines.h | 9 +- drivers/net/ethernet/intel/igc/igc_ethtool.c | 138 ++++++++++++++----- drivers/net/ethernet/intel/igc/igc_hw.h | 9 ++ drivers/net/ethernet/intel/igc/igc_mac.c | 12 ++ drivers/net/ethernet/intel/igc/igc_main.c | 2 +- drivers/net/ethernet/intel/igc/igc_phy.c | 65 ++++++++- drivers/net/ethernet/intel/igc/igc_phy.h | 1 + 8 files changed, 220 insertions(+), 51 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc_base.c b/drivers/net/ethern= et/intel/igc/igc_base.c index 1613b562d17c..ab9120a3127f 100644 --- a/drivers/net/ethernet/intel/igc/igc_base.c +++ b/drivers/net/ethernet/intel/igc/igc_base.c @@ -114,11 +114,35 @@ static s32 igc_setup_copper_link_base(struct igc_hw *= hw) u32 ctrl; =20 ctrl =3D rd32(IGC_CTRL); - ctrl |=3D IGC_CTRL_SLU; - ctrl &=3D ~(IGC_CTRL_FRCSPD | IGC_CTRL_FRCDPX); - wr32(IGC_CTRL, ctrl); - - ret_val =3D igc_setup_copper_link(hw); + ctrl &=3D ~(IGC_CTRL_FRCSPD | IGC_CTRL_FRCDPX | + IGC_CTRL_SPEED_MASK | IGC_CTRL_FD); + + if (hw->mac.autoneg_enabled) { + ctrl |=3D IGC_CTRL_SLU; + wr32(IGC_CTRL, ctrl); + ret_val =3D igc_setup_copper_link(hw); + } else { + ctrl |=3D IGC_CTRL_SLU | IGC_CTRL_FRCSPD | IGC_CTRL_FRCDPX; + + switch (hw->mac.forced_speed_duplex) { + case IGC_FORCED_10H: + ctrl |=3D IGC_CTRL_SPEED_10; + break; + case IGC_FORCED_10F: + ctrl |=3D IGC_CTRL_SPEED_10 | IGC_CTRL_FD; + break; + case IGC_FORCED_100H: + ctrl |=3D IGC_CTRL_SPEED_100; + break; + case IGC_FORCED_100F: + ctrl |=3D IGC_CTRL_SPEED_100 | IGC_CTRL_FD; + break; + default: + return -IGC_ERR_CONFIG; + } + wr32(IGC_CTRL, ctrl); + ret_val =3D igc_setup_copper_link(hw); + } =20 return ret_val; } @@ -443,6 +467,7 @@ static const struct igc_phy_operations igc_phy_ops_base= =3D { .reset =3D igc_phy_hw_reset, .read_reg =3D igc_read_phy_reg_gpy, .write_reg =3D igc_write_phy_reg_gpy, + .force_speed_duplex =3D igc_force_speed_duplex, }; =20 const struct igc_info igc_base_info =3D { diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/eth= ernet/intel/igc/igc_defines.h index 9482ab11f050..3f504751c2d9 100644 --- a/drivers/net/ethernet/intel/igc/igc_defines.h +++ b/drivers/net/ethernet/intel/igc/igc_defines.h @@ -129,10 +129,13 @@ #define IGC_ERR_SWFW_SYNC 13 =20 /* Device Control */ +#define IGC_CTRL_FD BIT(0) /* Full Duplex */ #define IGC_CTRL_RST 0x04000000 /* Global reset */ - #define IGC_CTRL_PHY_RST 0x80000000 /* PHY Reset */ #define IGC_CTRL_SLU 0x00000040 /* Set link up (Force Link) */ +#define IGC_CTRL_SPEED_MASK GENMASK(10, 8) +#define IGC_CTRL_SPEED_10 FIELD_PREP(IGC_CTRL_SPEED_MASK, 0) +#define IGC_CTRL_SPEED_100 FIELD_PREP(IGC_CTRL_SPEED_MASK, 1) #define IGC_CTRL_FRCSPD 0x00000800 /* Force Speed */ #define IGC_CTRL_FRCDPX 0x00001000 /* Force Duplex */ #define IGC_CTRL_VME 0x40000000 /* IEEE VLAN mode enable */ @@ -673,6 +676,10 @@ #define IGC_GEN_POLL_TIMEOUT 1920 =20 /* PHY Control Register */ +#define MII_CR_SPEED_MASK (BIT(6) | BIT(13)) +#define MII_CR_SPEED_10 0x0000 /* SSM=3D0, SSL=3D0: 10 Mb/s */ +#define MII_CR_SPEED_100 BIT(13) /* SSM=3D0, SSL=3D1: 100 Mb/s */ +#define MII_CR_DUPLEX_EN BIT(8) /* 0 =3D Half Duplex, 1 =3D Full Duplex */ #define MII_CR_RESTART_AUTO_NEG 0x0200 /* Restart auto negotiation */ #define MII_CR_POWER_DOWN 0x0800 /* Power down */ #define MII_CR_AUTO_NEG_EN 0x1000 /* Auto Neg Enable */ diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/eth= ernet/intel/igc/igc_ethtool.c index cfcbf2fdad6e..b103836a895f 100644 --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c @@ -1914,44 +1914,58 @@ static int igc_ethtool_get_link_ksettings(struct ne= t_device *netdev, ethtool_link_ksettings_add_link_mode(cmd, supported, TP); ethtool_link_ksettings_add_link_mode(cmd, advertising, TP); =20 - /* advertising link modes */ - if (hw->phy.autoneg_advertised & ADVERTISE_10_HALF) - ethtool_link_ksettings_add_link_mode(cmd, advertising, 10baseT_Half); - if (hw->phy.autoneg_advertised & ADVERTISE_10_FULL) - ethtool_link_ksettings_add_link_mode(cmd, advertising, 10baseT_Full); - if (hw->phy.autoneg_advertised & ADVERTISE_100_HALF) - ethtool_link_ksettings_add_link_mode(cmd, advertising, 100baseT_Half); - if (hw->phy.autoneg_advertised & ADVERTISE_100_FULL) - ethtool_link_ksettings_add_link_mode(cmd, advertising, 100baseT_Full); - if (hw->phy.autoneg_advertised & ADVERTISE_1000_FULL) - ethtool_link_ksettings_add_link_mode(cmd, advertising, 1000baseT_Full); - if (hw->phy.autoneg_advertised & ADVERTISE_2500_FULL) - ethtool_link_ksettings_add_link_mode(cmd, advertising, 2500baseT_Full); - /* set autoneg settings */ ethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg); - ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg); + if (hw->mac.autoneg_enabled) { + ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg); + cmd->base.autoneg =3D AUTONEG_ENABLE; + + /* advertising link modes only apply when autoneg is on */ + if (hw->phy.autoneg_advertised & ADVERTISE_10_HALF) + ethtool_link_ksettings_add_link_mode(cmd, advertising, + 10baseT_Half); + if (hw->phy.autoneg_advertised & ADVERTISE_10_FULL) + ethtool_link_ksettings_add_link_mode(cmd, advertising, + 10baseT_Full); + if (hw->phy.autoneg_advertised & ADVERTISE_100_HALF) + ethtool_link_ksettings_add_link_mode(cmd, advertising, + 100baseT_Half); + if (hw->phy.autoneg_advertised & ADVERTISE_100_FULL) + ethtool_link_ksettings_add_link_mode(cmd, advertising, + 100baseT_Full); + if (hw->phy.autoneg_advertised & ADVERTISE_1000_FULL) + ethtool_link_ksettings_add_link_mode(cmd, advertising, + 1000baseT_Full); + if (hw->phy.autoneg_advertised & ADVERTISE_2500_FULL) + ethtool_link_ksettings_add_link_mode(cmd, advertising, + 2500baseT_Full); + + /* Set pause flow control advertising */ + switch (hw->fc.requested_mode) { + case igc_fc_full: + ethtool_link_ksettings_add_link_mode(cmd, advertising, + Pause); + break; + case igc_fc_rx_pause: + ethtool_link_ksettings_add_link_mode(cmd, advertising, + Pause); + ethtool_link_ksettings_add_link_mode(cmd, advertising, + Asym_Pause); + break; + case igc_fc_tx_pause: + ethtool_link_ksettings_add_link_mode(cmd, advertising, + Asym_Pause); + break; + default: + break; + } + } else { + cmd->base.autoneg =3D AUTONEG_DISABLE; + } =20 - /* Set pause flow control settings */ + /* Pause is always supported */ ethtool_link_ksettings_add_link_mode(cmd, supported, Pause); =20 - switch (hw->fc.requested_mode) { - case igc_fc_full: - ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause); - break; - case igc_fc_rx_pause: - ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause); - ethtool_link_ksettings_add_link_mode(cmd, advertising, - Asym_Pause); - break; - case igc_fc_tx_pause: - ethtool_link_ksettings_add_link_mode(cmd, advertising, - Asym_Pause); - break; - default: - break; - } - status =3D pm_runtime_suspended(&adapter->pdev->dev) ? 0 : rd32(IGC_STATUS); =20 @@ -1983,7 +1997,6 @@ static int igc_ethtool_get_link_ksettings(struct net_= device *netdev, cmd->base.duplex =3D DUPLEX_UNKNOWN; } cmd->base.speed =3D speed; - cmd->base.autoneg =3D AUTONEG_ENABLE; =20 /* MDI-X =3D> 2; MDI =3D>1; Invalid =3D>0 */ if (hw->phy.media_type =3D=3D igc_media_type_copper) @@ -2000,6 +2013,37 @@ static int igc_ethtool_get_link_ksettings(struct net= _device *netdev, return 0; } =20 +/** + * igc_handle_autoneg_disabled - Configure forced speed/duplex settings + * @adapter: private driver structure + * @speed: requested speed (must be SPEED_10 or SPEED_100) + * @duplex: requested duplex + * + * Records forced speed/duplex when autoneg is disabled. + * Caller must validate speed before calling this function. + */ +static void igc_handle_autoneg_disabled(struct igc_adapter *adapter, u32 s= peed, + u8 duplex) +{ + struct igc_mac_info *mac =3D &adapter->hw.mac; + + switch (speed) { + case SPEED_10: + mac->forced_speed_duplex =3D (duplex =3D=3D DUPLEX_FULL) ? + IGC_FORCED_10F : IGC_FORCED_10H; + break; + case SPEED_100: + mac->forced_speed_duplex =3D (duplex =3D=3D DUPLEX_FULL) ? + IGC_FORCED_100F : IGC_FORCED_100H; + break; + default: + WARN_ONCE(1, "Unsupported speed %u\n", speed); + return; + } + + mac->autoneg_enabled =3D false; +} + /** * igc_handle_autoneg_enabled - Configure autonegotiation advertisement * @adapter: private driver structure @@ -2038,6 +2082,7 @@ static void igc_handle_autoneg_enabled(struct igc_ada= pter *adapter, 10baseT_Half)) advertised |=3D ADVERTISE_10_HALF; =20 + hw->mac.autoneg_enabled =3D true; hw->phy.autoneg_advertised =3D advertised; if (adapter->fc_autoneg) hw->fc.requested_mode =3D igc_fc_default; @@ -2059,6 +2104,12 @@ igc_ethtool_set_link_ksettings(struct net_device *ne= tdev, return -EINVAL; } =20 + if (cmd->base.autoneg !=3D AUTONEG_ENABLE && + cmd->base.autoneg !=3D AUTONEG_DISABLE) { + netdev_info(dev, "Unsupported autoneg setting\n"); + return -EINVAL; + } + /* MDI setting is only allowed when autoneg enabled because * some hardware doesn't allow MDI setting when speed or * duplex is forced. @@ -2071,14 +2122,25 @@ igc_ethtool_set_link_ksettings(struct net_device *n= etdev, } } =20 + if (cmd->base.autoneg =3D=3D AUTONEG_DISABLE) { + if (cmd->base.speed !=3D SPEED_10 && cmd->base.speed !=3D SPEED_100) { + netdev_info(dev, "Unsupported speed for forced link\n"); + return -EINVAL; + } + if (cmd->base.duplex !=3D DUPLEX_HALF && cmd->base.duplex !=3D DUPLEX_FU= LL) { + netdev_info(dev, "Duplex must be half or full for forced link\n"); + return -EINVAL; + } + } + while (test_and_set_bit(__IGC_RESETTING, &adapter->state)) usleep_range(1000, 2000); =20 - if (cmd->base.autoneg =3D=3D AUTONEG_ENABLE) { + if (cmd->base.autoneg =3D=3D AUTONEG_ENABLE) igc_handle_autoneg_enabled(adapter, cmd); - } else { - netdev_info(dev, "Force mode currently not supported\n"); - } + else + igc_handle_autoneg_disabled(adapter, cmd->base.speed, + cmd->base.duplex); =20 /* MDI-X =3D> 2; MDI =3D> 1; Auto =3D> 3 */ if (cmd->base.eth_tp_mdix_ctrl) { diff --git a/drivers/net/ethernet/intel/igc/igc_hw.h b/drivers/net/ethernet= /intel/igc/igc_hw.h index 86ab8f566f44..62aaee55668a 100644 --- a/drivers/net/ethernet/intel/igc/igc_hw.h +++ b/drivers/net/ethernet/intel/igc/igc_hw.h @@ -73,6 +73,13 @@ struct igc_info { =20 extern const struct igc_info igc_base_info; =20 +enum igc_forced_speed_duplex { + IGC_FORCED_10H, + IGC_FORCED_10F, + IGC_FORCED_100H, + IGC_FORCED_100F, +}; + struct igc_mac_info { struct igc_mac_operations ops; =20 @@ -93,6 +100,8 @@ struct igc_mac_info { bool arc_subsystem_valid; =20 bool get_link_status; + bool autoneg_enabled; + enum igc_forced_speed_duplex forced_speed_duplex; }; =20 struct igc_nvm_operations { diff --git a/drivers/net/ethernet/intel/igc/igc_mac.c b/drivers/net/etherne= t/intel/igc/igc_mac.c index 0a3d3f357505..d6f3f6618469 100644 --- a/drivers/net/ethernet/intel/igc/igc_mac.c +++ b/drivers/net/ethernet/intel/igc/igc_mac.c @@ -446,6 +446,17 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw) u16 speed, duplex; s32 ret_val =3D 0; =20 + /* Without autoneg, flow control capability is not exchanged with the + * link partner. IEEE 802.3 prohibits flow control in half-duplex mode. + */ + if (!hw->mac.autoneg_enabled) { + if (hw->mac.forced_speed_duplex =3D=3D IGC_FORCED_10H || + hw->mac.forced_speed_duplex =3D=3D IGC_FORCED_100H) + hw->fc.current_mode =3D igc_fc_none; + + goto force_fc; + } + /* In auto-neg, we need to check and see if Auto-Neg has completed, * and if so, how the PHY and link partner has flow control * configured. @@ -607,6 +618,7 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw) /* Now we call a subroutine to actually force the MAC * controller to use the correct flow control settings. */ +force_fc: ret_val =3D igc_force_mac_fc(hw); if (ret_val) { hw_dbg("Error forcing flow control settings\n"); diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethern= et/intel/igc/igc_main.c index 72bc5128d8b8..437e1d1ef1e4 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -7298,7 +7298,7 @@ static int igc_probe(struct pci_dev *pdev, /* Initialize link properties that are user-changeable */ adapter->fc_autoneg =3D true; hw->phy.autoneg_advertised =3D 0xaf; - + hw->mac.autoneg_enabled =3D true; hw->fc.requested_mode =3D igc_fc_default; hw->fc.current_mode =3D igc_fc_default; =20 diff --git a/drivers/net/ethernet/intel/igc/igc_phy.c b/drivers/net/etherne= t/intel/igc/igc_phy.c index 6c4d204aecfa..4cf737fb3b21 100644 --- a/drivers/net/ethernet/intel/igc/igc_phy.c +++ b/drivers/net/ethernet/intel/igc/igc_phy.c @@ -494,12 +494,20 @@ s32 igc_setup_copper_link(struct igc_hw *hw) s32 ret_val =3D 0; bool link; =20 - /* Setup autoneg and flow control advertisement and perform - * autonegotiation. - */ - ret_val =3D igc_copper_link_autoneg(hw); - if (ret_val) - goto out; + if (hw->mac.autoneg_enabled) { + /* Setup autoneg and flow control advertisement and perform + * autonegotiation. + */ + ret_val =3D igc_copper_link_autoneg(hw); + if (ret_val) + goto out; + } else { + ret_val =3D hw->phy.ops.force_speed_duplex(hw); + if (ret_val) { + hw_dbg("Error Forcing Speed/Duplex\n"); + goto out; + } + } =20 /* Check link status. Wait up to 100 microseconds for link to become * valid. @@ -778,3 +786,48 @@ u16 igc_read_phy_fw_version(struct igc_hw *hw) =20 return gphy_version; } + +/** + * igc_force_speed_duplex - Force PHY speed and duplex settings + * @hw: pointer to the HW structure + * + * Programs the GPY PHY control register to disable autonegotiation + * and force the speed/duplex indicated by hw->mac.forced_speed_duplex. + */ +s32 igc_force_speed_duplex(struct igc_hw *hw) +{ + struct igc_phy_info *phy =3D &hw->phy; + u16 phy_ctrl; + s32 ret_val; + + ret_val =3D phy->ops.read_reg(hw, PHY_CONTROL, &phy_ctrl); + if (ret_val) + return ret_val; + + phy_ctrl &=3D ~(MII_CR_SPEED_MASK | MII_CR_DUPLEX_EN | + MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); + + switch (hw->mac.forced_speed_duplex) { + case IGC_FORCED_10H: + phy_ctrl |=3D MII_CR_SPEED_10; + break; + case IGC_FORCED_10F: + phy_ctrl |=3D MII_CR_SPEED_10 | MII_CR_DUPLEX_EN; + break; + case IGC_FORCED_100H: + phy_ctrl |=3D MII_CR_SPEED_100; + break; + case IGC_FORCED_100F: + phy_ctrl |=3D MII_CR_SPEED_100 | MII_CR_DUPLEX_EN; + break; + default: + return -IGC_ERR_CONFIG; + } + + ret_val =3D phy->ops.write_reg(hw, PHY_CONTROL, phy_ctrl); + if (ret_val) + return ret_val; + + hw->mac.get_link_status =3D true; + return 0; +} diff --git a/drivers/net/ethernet/intel/igc/igc_phy.h b/drivers/net/etherne= t/intel/igc/igc_phy.h index 832a7e359f18..d37a89174826 100644 --- a/drivers/net/ethernet/intel/igc/igc_phy.h +++ b/drivers/net/ethernet/intel/igc/igc_phy.h @@ -18,5 +18,6 @@ void igc_power_down_phy_copper(struct igc_hw *hw); s32 igc_write_phy_reg_gpy(struct igc_hw *hw, u32 offset, u16 data); s32 igc_read_phy_reg_gpy(struct igc_hw *hw, u32 offset, u16 *data); u16 igc_read_phy_fw_version(struct igc_hw *hw); +s32 igc_force_speed_duplex(struct igc_hw *hw); =20 #endif --=20 2.43.0