Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp478591yba; Mon, 1 Apr 2019 10:06:36 -0700 (PDT) X-Google-Smtp-Source: APXvYqxld9PsYbXpQZkcpC1BTLu1qXzB7JzFYAHxaQG58oz1EkVh8Z6upW1EBp095z1epivcB6la X-Received: by 2002:a63:6a42:: with SMTP id f63mr35447837pgc.207.1554138396664; Mon, 01 Apr 2019 10:06:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554138396; cv=none; d=google.com; s=arc-20160816; b=uKfo7fzSrvkGOVvbrGECM08xM//Y8izuX3pW0YsilgU6Is/6aPd7Ls5HrqENrlud4M n6giDq1yqr8fCiFOpgEuXJR3GgbY5rUdJxnk6cis2/A7+Z/Ptw8wpIPKmoVuSWV5PdR1 zX957ao7LpnXvxTIUy4GNMXkPyIu0etmVVVbdjhsS3NM8jShSO6ZA6lEJ5LZ+7ayY9Rx L+pMZPKTcbaCGMBhDa7lVothHdwbTyA+kaNzWraFGktMUev4dCAxB6pauRLCnNXqghXd 4PMwDAok3a4c2JJerJyeci+Ebq+iqCQTo9XskXeYV1EVd3xTGBmcPMqdN5EAgMPjzU9Q EeFQ== 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=mRg/QFpPfitbCfwCgma1GReXcRsHLx+3TjPjoXXtQGE=; b=YFpKFUAy62nDw+Ep++Gp+/YKoe83KH6UVLCHPZqC2vPxrJdz6MEunt0tyvBOx4CyuR 8J/LqVrWoY9Ve7S4hNC7+7LEFYobCegTuoMIEvXc97Wmz+2JUyvwTQedY75fsZufkZZg uqQOwjYxnmfpnhMBtdcXAXCGbYA4k50kpi3/SP+RCAIh+MKFnwT3MAgblSIKm395QT2R 05n+rbtZ1eKsyx6qashCcW1nhBerZYuvlkfo2nAA0xPTde7cHAitKLL+wy9GnKJ1/M+F wfE0UYHEeQaRK7i/AS3JfMDQ4vMvmOrxD1lIPEkcnEPzf0s2vajQdJQsJEZZ+ZsS687v ZZdQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=LrAlQ1vA; 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 d34si8913741pld.407.2019.04.01.10.06.21; Mon, 01 Apr 2019 10:06:36 -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=LrAlQ1vA; 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 S1728926AbfDARFV (ORCPT + 99 others); Mon, 1 Apr 2019 13:05:21 -0400 Received: from mail.kernel.org ([198.145.29.99]:50378 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728917AbfDARFU (ORCPT ); Mon, 1 Apr 2019 13:05:20 -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 57D3E21925; Mon, 1 Apr 2019 17:05:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554138318; bh=h86hAaKA0Ah6pwhQnxgq6BJ17E0czsx2sp3TXFDJr3A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LrAlQ1vAUuTtT8fUDKDruAB3wZSZAJfjDoML/a/qhaHqhfylmYMngURltx2E2C1yJ o8kK+IDkbfgZDiFJWybk6v0NcY6DRbK62qUFThu22OStCPmBTKHgRYrAd7McGuG/nD ADawq93/qANmE8xYQIGnoAjqzPoYNHBG+3IA5P/E= 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" Subject: [PATCH 5.0 031/146] net: dsa: mv88e6xxx: fix few issues in mv88e6390x_port_set_cmode Date: Mon, 1 Apr 2019 19:00:43 +0200 Message-Id: <20190401170051.178861898@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190401170048.449559024@linuxfoundation.org> References: <20190401170048.449559024@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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 5.0-stable review patch. If anyone has any objections, please let me know. ------------------ From: Heiner Kallweit [ 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: Greg Kroah-Hartman --- drivers/net/dsa/mv88e6xxx/port.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -427,18 +427,22 @@ int mv88e6390x_port_set_cmode(struct mv8 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, ®); @@ -452,6 +456,12 @@ int mv88e6390x_port_set_cmode(struct mv8 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; @@ -463,8 +473,6 @@ int mv88e6390x_port_set_cmode(struct mv8 } } - chip->ports[port].cmode = cmode; - return 0; }