Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp476694yba; Wed, 15 May 2019 04:50:03 -0700 (PDT) X-Google-Smtp-Source: APXvYqwB9BPJ3b35mk4WxPG/yHDTKq7vdM5ORigfaZOEeLu86dqhxfp+okOaMkQCx3sR6qiLQPLN X-Received: by 2002:a17:902:9a4a:: with SMTP id x10mr42767320plv.113.1557921002970; Wed, 15 May 2019 04:50:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1557921002; cv=none; d=google.com; s=arc-20160816; b=MMWx5P911x/txBS6dmzBPTYaZWlyzPmbS3eUuMVsTOWSpwo7/L/7f7a+Q5HLdXTeXM yf0b/qhwZIzCjuoKw1rGCMbzyqnzw1801yXbs5wYdENO7BeUVUT0Q8DtFXepOrU8gPz9 QqTf5cZiC6AiPuaZVqibHDXsckuDMqxRWQWM3mbSkAJoNaam++q8AMpMdQM7krZusLHn 5iR2kZId496Z8Tnq+PcPcEjMyPYcwXGM+huNrv0DR683J/tvUmzYytiGRmu/OgT4pxQi EgaGkumMk/N9XhYyDhyiz66iV8NTeuP13O7iJfR3z8561w1WCVjsuOubgljKrBige4AH MQEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=vWdOZTNqvCH1519eLMF5QNh/2vUzrF8GJ2yOr3pSm8k=; b=WCxrbRZj2awCh1l4rytxhKvjlEgqLjqU0DUj8KfHpVsiqBOas/1tbTdMYgenEeQ4pg f/mTi3Eq96PgSpX+r6GRg9/Aiw55Rl/AyuPy2Jq5xsyUf4nE+Uh6/ewlrxFwyvPpl6E1 SZ84BUyCJ0JimcWNEbyGyS2+gS9lv3EeFXu5CTOaspubG9PpmO3zJfjgIYs5STpFDyU4 N2UZu4jv2xUSiJzOep6r16AfJgPrr5yDlixkkbOvvovb6S4jutcFYkNp7ZZUfsRpX23j iFDCQhWgA0HzPSq4dN7laAdET07hpoGEYhcxYUWP20ac6FQWZFpX3/YYhKBU0/2XEbmn MXlw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=0SKiGbxS; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m189si1907244pfb.74.2019.05.15.04.49.48; Wed, 15 May 2019 04:50:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=0SKiGbxS; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731684AbfEOLXk (ORCPT + 99 others); Wed, 15 May 2019 07:23:40 -0400 Received: from mail.kernel.org ([198.145.29.99]:34052 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731146AbfEOLXi (ORCPT ); Wed, 15 May 2019 07:23:38 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C94DC206BF; Wed, 15 May 2019 11:23:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1557919417; bh=kWtr6FzKjaWPfHKVSImpDJZdsyMw1mqvtfvNhv6cC+8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0SKiGbxSgiXg+DNfJU2j+sHYxlefhD4RqUfDB2QOyOjgIA2nZch0TpxknfChizxi2 2PB7UMRJZ3JjR1aC14D4Vlb0dvM04cC14IGswNpT3LTpH023hxNDRBY3Gvah2VXwLg j6Zd9fiwgLG7y81Fc1Tt/PY4lIwh61OAZfPnA0ec= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Heiner Kallweit , Florian Fainelli , "David S. Miller" , Sasha Levin Subject: [PATCH 4.19 067/113] net: dsa: mv88e6xxx: fix few issues in mv88e6390x_port_set_cmode Date: Wed, 15 May 2019 12:55:58 +0200 Message-Id: <20190515090658.621165565@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190515090652.640988966@linuxfoundation.org> References: <20190515090652.640988966@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit 5ceaeb99ffb4dc002d20f6ac243c19a85e2c7a76 ] This patches fixes few issues in mv88e6390x_port_set_cmode(). 1. When entering the function the old cmode may be 0, in this case mv88e6390x_serdes_get_lane() returns -ENODEV. As result we bail out and have no chance to set a new mode. Therefore deal properly with -ENODEV. 2. Once we have disabled power and irq, let's set the cached cmode to 0. This reflects the actual status and is cleaner if we bail out with an error in the following function calls. 3. The cached cmode is used by mv88e6390x_serdes_get_lane(), mv88e6390_serdes_power_lane() and mv88e6390_serdes_irq_enable(). Currently we set the cached mode to the new one at the very end of the function only, means until then we use the old one what may be wrong. 4. When calling mv88e6390_serdes_irq_enable() we use the lane value belonging to the old cmode. Get the lane belonging to the new cmode before calling this function. It's hard to provide a good "Fixes" tag because quite a few smaller changes have been done to the code in question recently. Fixes: d235c48b40d3 ("net: dsa: mv88e6xxx: power serdes on/off for 10G interfaces on 6390X") Signed-off-by: Heiner Kallweit Reviewed-by: Florian Fainelli Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/dsa/mv88e6xxx/port.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c index 7fffce734f0a5..fdeddbfa829da 100644 --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -379,18 +379,22 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port, return 0; lane = mv88e6390x_serdes_get_lane(chip, port); - if (lane < 0) + if (lane < 0 && lane != -ENODEV) return lane; - if (chip->ports[port].serdes_irq) { - err = mv88e6390_serdes_irq_disable(chip, port, lane); + if (lane >= 0) { + if (chip->ports[port].serdes_irq) { + err = mv88e6390_serdes_irq_disable(chip, port, lane); + if (err) + return err; + } + + err = mv88e6390x_serdes_power(chip, port, false); if (err) return err; } - err = mv88e6390x_serdes_power(chip, port, false); - if (err) - return err; + chip->ports[port].cmode = 0; if (cmode) { err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®); @@ -404,6 +408,12 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port, if (err) return err; + chip->ports[port].cmode = cmode; + + lane = mv88e6390x_serdes_get_lane(chip, port); + if (lane < 0) + return lane; + err = mv88e6390x_serdes_power(chip, port, true); if (err) return err; @@ -415,8 +425,6 @@ int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port, } } - chip->ports[port].cmode = cmode; - return 0; } -- 2.20.1