Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3718063pxv; Mon, 26 Jul 2021 10:08:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLRIYkt7GE8s/Q2xCL61YipkJB0ZTdc4Ene4rBpVQCLVR5hyjsILAp/mTMGspv0zvxKCnS X-Received: by 2002:a5e:8401:: with SMTP id h1mr5686382ioj.75.1627319334421; Mon, 26 Jul 2021 10:08:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627319334; cv=none; d=google.com; s=arc-20160816; b=0Nk6NroK2wPByOrSm1aq4ezcMY4hFSleIijp/16vNqyky4bqJLBSp5d0VPStmdeICv eSYcfCAnqrRcOiE+0k3aVF/Q20cCa0PiQN3CHEvqa7YHRDRGslMmk5wb1e2L/ruYKOlb 8WsGiuVLMLZ1fTXIDsxsyewJTk6vY4wo5yqCNk/qWvvJeL7k40LALGGOdihRUXgjgsP7 4z8TJV6l7GsS+unMqJB1fphAzqx/M0OdE70rh6hqdcmAk1KU9v3a/kBBVW+iJgYGfrU1 /nhO22vMWN4lynu+tvo9nrgLE6GgaZYiHeRreX+hb7QnmsR4UWFTfPi9oJfJE8hm0aXc 9aBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=9M3jcU2Bvs8bQMi3GmpXSJK6bjMGm5XFMuTz5NGAA/g=; b=m+kDJGCr0X9OnmIlyd8ngqQsi4BpD2hFE7VkRxRJmpyRZxcQ/Ba4qa9VvDthCdsKhB 0gr5E/ScW7AflT3gOEKc8gKWEu99ptPCO6BTjq0b07cCDkcvFjL/Ec+/87qIOaoz4g0R M1wH8o+SsG4maKjLuwAOY9NaVaCul1fqMtD/BmTGcwVEqWJejs5h2VvcB4BT6dReTgTi emvzOrUzrVtuA5IpoCxSyyNsbGeO+13nB1RLqXWOJvOJzBgEHQl8LWcmrYGwOjzmxwN+ o0Fj1og1lwct4negF4pEj/Dgg6Ghzu1mRQZW56f2PSDSv8+stOXygNXfCHctxJLMn069 omkQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="lY/euYW/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id x4si461651ilj.71.2021.07.26.10.08.41; Mon, 26 Jul 2021 10:08:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="lY/euYW/"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237803AbhGZPq0 (ORCPT + 99 others); Mon, 26 Jul 2021 11:46:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:41424 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237802AbhGZP3Y (ORCPT ); Mon, 26 Jul 2021 11:29:24 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id D181861040; Mon, 26 Jul 2021 16:08:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315717; bh=fNxw5SKCDkE9+m8dpC5RvRb/DfRXI/Nm5DAV31/ZDoI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lY/euYW/cUsFPJMp9K4HnlovGgY7WECy93mS9VcvYs5Zt5EvkJCl4uOqLapAn+YUO O9TRbW/unQAzsxat0o9Bdi0GKZPaP2NZiEXjCi7g5qtJxhCkaiGmHJOwJUnBOxfTuw 7CSlKWH1y0DZKhywCvjZk4HeqvrMLwwjQAdcaXnI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, =?UTF-8?q?Marek=20Beh=C3=BAn?= , Matteo Croce , Matteo Croce , "David S. Miller" , Sasha Levin Subject: [PATCH 5.13 039/223] net: phy: marvell10g: fix differentiation of 88X3310 from 88X3340 Date: Mon, 26 Jul 2021 17:37:11 +0200 Message-Id: <20210726153847.526118470@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153846.245305071@linuxfoundation.org> References: <20210726153846.245305071@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marek BehĂșn [ Upstream commit a5de4be0aaaa66a2fa98e8a33bdbed3bd0682804 ] It seems that we cannot differentiate 88X3310 from 88X3340 by simply looking at bit 3 of revision ID. This only works on revisions A0 and A1. On revision B0, this bit is always 1. Instead use the 3.d00d register for differentiation, since this register contains information about number of ports on the device. Fixes: 9885d016ffa9 ("net: phy: marvell10g: add separate structure for 88X3340") Signed-off-by: Marek BehĂșn Reported-by: Matteo Croce Tested-by: Matteo Croce Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/phy/marvell10g.c | 40 +++++++++++++++++++++++++++++++----- include/linux/marvell_phy.h | 6 +----- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c index bbbc6ac8fa82..53a433442803 100644 --- a/drivers/net/phy/marvell10g.c +++ b/drivers/net/phy/marvell10g.c @@ -78,6 +78,11 @@ enum { /* Temperature read register (88E2110 only) */ MV_PCS_TEMP = 0x8042, + /* Number of ports on the device */ + MV_PCS_PORT_INFO = 0xd00d, + MV_PCS_PORT_INFO_NPORTS_MASK = 0x0380, + MV_PCS_PORT_INFO_NPORTS_SHIFT = 7, + /* These registers appear at 0x800X and 0xa00X - the 0xa00X control * registers appear to set themselves to the 0x800X when AN is * restarted, but status registers appear readable from either. @@ -966,6 +971,30 @@ static const struct mv3310_chip mv2111_type = { #endif }; +static int mv3310_get_number_of_ports(struct phy_device *phydev) +{ + int ret; + + ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_PORT_INFO); + if (ret < 0) + return ret; + + ret &= MV_PCS_PORT_INFO_NPORTS_MASK; + ret >>= MV_PCS_PORT_INFO_NPORTS_SHIFT; + + return ret + 1; +} + +static int mv3310_match_phy_device(struct phy_device *phydev) +{ + return mv3310_get_number_of_ports(phydev) == 1; +} + +static int mv3340_match_phy_device(struct phy_device *phydev) +{ + return mv3310_get_number_of_ports(phydev) == 4; +} + static int mv211x_match_phy_device(struct phy_device *phydev, bool has_5g) { int val; @@ -994,7 +1023,8 @@ static int mv2111_match_phy_device(struct phy_device *phydev) static struct phy_driver mv3310_drivers[] = { { .phy_id = MARVELL_PHY_ID_88X3310, - .phy_id_mask = MARVELL_PHY_ID_88X33X0_MASK, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .match_phy_device = mv3310_match_phy_device, .name = "mv88x3310", .driver_data = &mv3310_type, .get_features = mv3310_get_features, @@ -1011,8 +1041,9 @@ static struct phy_driver mv3310_drivers[] = { .set_loopback = genphy_c45_loopback, }, { - .phy_id = MARVELL_PHY_ID_88X3340, - .phy_id_mask = MARVELL_PHY_ID_88X33X0_MASK, + .phy_id = MARVELL_PHY_ID_88X3310, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .match_phy_device = mv3340_match_phy_device, .name = "mv88x3340", .driver_data = &mv3340_type, .get_features = mv3310_get_features, @@ -1069,8 +1100,7 @@ static struct phy_driver mv3310_drivers[] = { module_phy_driver(mv3310_drivers); static struct mdio_device_id __maybe_unused mv3310_tbl[] = { - { MARVELL_PHY_ID_88X3310, MARVELL_PHY_ID_88X33X0_MASK }, - { MARVELL_PHY_ID_88X3340, MARVELL_PHY_ID_88X33X0_MASK }, + { MARVELL_PHY_ID_88X3310, MARVELL_PHY_ID_MASK }, { MARVELL_PHY_ID_88E2110, MARVELL_PHY_ID_MASK }, { }, }; diff --git a/include/linux/marvell_phy.h b/include/linux/marvell_phy.h index acee44b9db26..0f06c2287b52 100644 --- a/include/linux/marvell_phy.h +++ b/include/linux/marvell_phy.h @@ -22,14 +22,10 @@ #define MARVELL_PHY_ID_88E1545 0x01410ea0 #define MARVELL_PHY_ID_88E1548P 0x01410ec0 #define MARVELL_PHY_ID_88E3016 0x01410e60 +#define MARVELL_PHY_ID_88X3310 0x002b09a0 #define MARVELL_PHY_ID_88E2110 0x002b09b0 #define MARVELL_PHY_ID_88X2222 0x01410f10 -/* PHY IDs and mask for Alaska 10G PHYs */ -#define MARVELL_PHY_ID_88X33X0_MASK 0xfffffff8 -#define MARVELL_PHY_ID_88X3310 0x002b09a0 -#define MARVELL_PHY_ID_88X3340 0x002b09a8 - /* Marvel 88E1111 in Finisar SFP module with modified PHY ID */ #define MARVELL_PHY_ID_88E1111_FINISAR 0x01ff0cc0 -- 2.30.2