You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
8.0 KiB
223 lines
8.0 KiB
From 30aa407c61b51affcb753a12a2f347daee0a17a4 Mon Sep 17 00:00:00 2001
|
|
From: Igor Russkikh <irusskik@redhat.com>
|
|
Date: Fri, 6 Nov 2020 18:38:17 -0500
|
|
Subject: [PATCH 120/139] [netdrv] net: atlantic: disable PTP on AQC111, AQC112
|
|
|
|
Message-id: <1604687916-15087-121-git-send-email-irusskik@redhat.com>
|
|
Patchwork-id: 338542
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.4 BZ 1857861 120/139] net: atlantic: disable PTP on AQC111, AQC112
|
|
Bugzilla: 1857861
|
|
RH-Acked-by: David Arcari <darcari@redhat.com>
|
|
RH-Acked-by: John Linville <linville@redhat.com>
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1857861
|
|
|
|
commit 23e500e88723f243c27e1b26c9d035d4cdd1b24a
|
|
Author: Nikita Danilov <ndanilov@marvell.com>
|
|
Date: Fri Jul 17 23:39:49 2020 +0300
|
|
|
|
net: atlantic: disable PTP on AQC111, AQC112
|
|
|
|
This patch disables PTP on AQC111 and AQC112 due to a known HW issue,
|
|
which can cause datapath issues.
|
|
|
|
Ideally PTP block should have been disabled via PHY provisioning, but
|
|
unfortunately many units have been shipped with enabled PTP block.
|
|
Thus, we have to work around this in the driver.
|
|
|
|
Fixes: dbcd6806af420 ("net: aquantia: add support for Phy access")
|
|
Signed-off-by: Nikita Danilov <ndanilov@marvell.com>
|
|
Signed-off-by: Mark Starovoytov <mstarovoitov@marvell.com>
|
|
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
Signed-off-by: Igor Russkikh <irusskik@redhat.com>
|
|
|
|
Cc: David Arcari <darcari@redhat.com>
|
|
Cc: Igor Russkikh <irusskik@redhat.com>
|
|
Signed-off-by: Jan Stancek <jstancek@redhat.com>
|
|
---
|
|
drivers/net/ethernet/aquantia/atlantic/aq_hw.h | 1 +
|
|
drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 9 +++++++
|
|
drivers/net/ethernet/aquantia/atlantic/aq_nic.h | 2 ++
|
|
drivers/net/ethernet/aquantia/atlantic/aq_phy.c | 29 ++++++++++++++++++++--
|
|
drivers/net/ethernet/aquantia/atlantic/aq_phy.h | 8 ++++--
|
|
.../ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | 19 ++++++++++++++
|
|
.../ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h | 10 +++-----
|
|
7 files changed, 68 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
|
|
index d203057f49eb..9fab7a1bea71 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
|
|
@@ -65,6 +65,7 @@ struct aq_hw_caps_s {
|
|
u8 rx_rings;
|
|
bool flow_control;
|
|
bool is_64_dma;
|
|
+ u32 quirks;
|
|
u32 priv_data_len;
|
|
};
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
index d75694e9a162..1513669b2529 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
@@ -399,6 +399,15 @@ int aq_nic_init(struct aq_nic_s *self)
|
|
self->aq_nic_cfg.aq_hw_caps->media_type == AQ_HW_MEDIA_TYPE_TP) {
|
|
self->aq_hw->phy_id = HW_ATL_PHY_ID_MAX;
|
|
err = aq_phy_init(self->aq_hw);
|
|
+
|
|
+ /* Disable the PTP on NICs where it's known to cause datapath
|
|
+ * problems.
|
|
+ * Ideally this should have been done by PHY provisioning, but
|
|
+ * many units have been shipped with enabled PTP block already.
|
|
+ */
|
|
+ if (self->aq_nic_cfg.aq_hw_caps->quirks & AQ_NIC_QUIRK_BAD_PTP)
|
|
+ if (self->aq_hw->phy_id != HW_ATL_PHY_ID_MAX)
|
|
+ aq_phy_disable_ptp(self->aq_hw);
|
|
}
|
|
|
|
for (i = 0U; i < self->aq_vecs; i++) {
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
|
|
index 80c70938afd7..b5b0a66ccc03 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
|
|
@@ -81,6 +81,8 @@ struct aq_nic_cfg_s {
|
|
#define AQ_NIC_FLAG_ERR_UNPLUG 0x40000000U
|
|
#define AQ_NIC_FLAG_ERR_HW 0x80000000U
|
|
|
|
+#define AQ_NIC_QUIRK_BAD_PTP BIT(0)
|
|
+
|
|
#define AQ_NIC_WOL_MODES (WAKE_MAGIC |\
|
|
WAKE_PHY)
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_phy.c b/drivers/net/ethernet/aquantia/atlantic/aq_phy.c
|
|
index 51ae921e3e1f..949ac2351701 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_phy.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_phy.c
|
|
@@ -1,10 +1,14 @@
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
-/* aQuantia Corporation Network Driver
|
|
- * Copyright (C) 2018-2019 aQuantia Corporation. All rights reserved
|
|
+/* Atlantic Network Driver
|
|
+ *
|
|
+ * Copyright (C) 2018-2019 aQuantia Corporation
|
|
+ * Copyright (C) 2019-2020 Marvell International Ltd.
|
|
*/
|
|
|
|
#include "aq_phy.h"
|
|
|
|
+#define HW_ATL_PTP_DISABLE_MSK BIT(10)
|
|
+
|
|
bool aq_mdio_busy_wait(struct aq_hw_s *aq_hw)
|
|
{
|
|
int err = 0;
|
|
@@ -145,3 +149,24 @@ bool aq_phy_init(struct aq_hw_s *aq_hw)
|
|
|
|
return true;
|
|
}
|
|
+
|
|
+void aq_phy_disable_ptp(struct aq_hw_s *aq_hw)
|
|
+{
|
|
+ static const u16 ptp_registers[] = {
|
|
+ 0x031e,
|
|
+ 0x031d,
|
|
+ 0x031c,
|
|
+ 0x031b,
|
|
+ };
|
|
+ u16 val;
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE(ptp_registers); i++) {
|
|
+ val = aq_phy_read_reg(aq_hw, MDIO_MMD_VEND1,
|
|
+ ptp_registers[i]);
|
|
+
|
|
+ aq_phy_write_reg(aq_hw, MDIO_MMD_VEND1,
|
|
+ ptp_registers[i],
|
|
+ val & ~HW_ATL_PTP_DISABLE_MSK);
|
|
+ }
|
|
+}
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_phy.h b/drivers/net/ethernet/aquantia/atlantic/aq_phy.h
|
|
index 84b72ad04a4a..86cc1ee836e2 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_phy.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_phy.h
|
|
@@ -1,6 +1,8 @@
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
-/* aQuantia Corporation Network Driver
|
|
- * Copyright (C) 2018-2019 aQuantia Corporation. All rights reserved
|
|
+/* Atlantic Network Driver
|
|
+ *
|
|
+ * Copyright (C) 2018-2019 aQuantia Corporation
|
|
+ * Copyright (C) 2019-2020 Marvell International Ltd.
|
|
*/
|
|
|
|
#ifndef AQ_PHY_H
|
|
@@ -29,4 +31,6 @@ bool aq_phy_init_phy_id(struct aq_hw_s *aq_hw);
|
|
|
|
bool aq_phy_init(struct aq_hw_s *aq_hw);
|
|
|
|
+void aq_phy_disable_ptp(struct aq_hw_s *aq_hw);
|
|
+
|
|
#endif /* AQ_PHY_H */
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
|
|
index b023c3324a59..b59333898fb7 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
|
|
@@ -93,6 +93,25 @@ const struct aq_hw_caps_s hw_atl_b0_caps_aqc109 = {
|
|
AQ_NIC_RATE_100M,
|
|
};
|
|
|
|
+const struct aq_hw_caps_s hw_atl_b0_caps_aqc111 = {
|
|
+ DEFAULT_B0_BOARD_BASIC_CAPABILITIES,
|
|
+ .media_type = AQ_HW_MEDIA_TYPE_TP,
|
|
+ .link_speed_msk = AQ_NIC_RATE_5G |
|
|
+ AQ_NIC_RATE_2G5 |
|
|
+ AQ_NIC_RATE_1G |
|
|
+ AQ_NIC_RATE_100M,
|
|
+ .quirks = AQ_NIC_QUIRK_BAD_PTP,
|
|
+};
|
|
+
|
|
+const struct aq_hw_caps_s hw_atl_b0_caps_aqc112 = {
|
|
+ DEFAULT_B0_BOARD_BASIC_CAPABILITIES,
|
|
+ .media_type = AQ_HW_MEDIA_TYPE_TP,
|
|
+ .link_speed_msk = AQ_NIC_RATE_2G5 |
|
|
+ AQ_NIC_RATE_1G |
|
|
+ AQ_NIC_RATE_100M,
|
|
+ .quirks = AQ_NIC_QUIRK_BAD_PTP,
|
|
+};
|
|
+
|
|
static int hw_atl_b0_hw_reset(struct aq_hw_s *self)
|
|
{
|
|
int err = 0;
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h
|
|
index 66d158900141..d8db972113ec 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.h
|
|
@@ -18,17 +18,15 @@ extern const struct aq_hw_caps_s hw_atl_b0_caps_aqc100;
|
|
extern const struct aq_hw_caps_s hw_atl_b0_caps_aqc107;
|
|
extern const struct aq_hw_caps_s hw_atl_b0_caps_aqc108;
|
|
extern const struct aq_hw_caps_s hw_atl_b0_caps_aqc109;
|
|
-
|
|
-#define hw_atl_b0_caps_aqc111 hw_atl_b0_caps_aqc108
|
|
-#define hw_atl_b0_caps_aqc112 hw_atl_b0_caps_aqc109
|
|
+extern const struct aq_hw_caps_s hw_atl_b0_caps_aqc111;
|
|
+extern const struct aq_hw_caps_s hw_atl_b0_caps_aqc112;
|
|
|
|
#define hw_atl_b0_caps_aqc100s hw_atl_b0_caps_aqc100
|
|
#define hw_atl_b0_caps_aqc107s hw_atl_b0_caps_aqc107
|
|
#define hw_atl_b0_caps_aqc108s hw_atl_b0_caps_aqc108
|
|
#define hw_atl_b0_caps_aqc109s hw_atl_b0_caps_aqc109
|
|
-
|
|
-#define hw_atl_b0_caps_aqc111s hw_atl_b0_caps_aqc108
|
|
-#define hw_atl_b0_caps_aqc112s hw_atl_b0_caps_aqc109
|
|
+#define hw_atl_b0_caps_aqc111s hw_atl_b0_caps_aqc111
|
|
+#define hw_atl_b0_caps_aqc112s hw_atl_b0_caps_aqc112
|
|
|
|
extern const struct aq_hw_ops hw_atl_ops_b0;
|
|
|
|
--
|
|
2.13.6
|
|
|