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.
396 lines
11 KiB
396 lines
11 KiB
From 0f6d832a6ed8f70ddf6e2217037a640f40e0874e Mon Sep 17 00:00:00 2001
|
|
From: Igor Russkikh <irusskik@redhat.com>
|
|
Date: Fri, 6 Nov 2020 18:36:36 -0500
|
|
Subject: [PATCH 019/139] [netdrv] net: aquantia: PTP skeleton declarations and
|
|
callbacks
|
|
|
|
Message-id: <1604687916-15087-20-git-send-email-irusskik@redhat.com>
|
|
Patchwork-id: 338445
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.4 BZ 1857861 019/139] net: aquantia: PTP skeleton declarations and callbacks
|
|
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 1a64f8dc82b1a96baae3dc7eecbbbb6a315f1512
|
|
Author: Egor Pomozov <epomozov@marvell.com>
|
|
Date: Tue Oct 22 09:53:22 2019 +0000
|
|
|
|
net: aquantia: PTP skeleton declarations and callbacks
|
|
|
|
Here we add basic function for PTP clock register/unregister.
|
|
We also declare FW/HW capability bits used to control PTP feature on device.
|
|
|
|
PTP device is created if network card has appropriate FW that has PTP
|
|
enabled in config. HW supports timestamping for PTPv2 802.AS1 and
|
|
PTPv2 IPv4 UDP packets.
|
|
|
|
It also supports basic PTP callbacks for getting/setting time, adjusting
|
|
frequency and time as well.
|
|
|
|
Signed-off-by: Egor Pomozov <epomozov@marvell.com>
|
|
Co-developed-by: Sergey Samoilenko <sergey.samoilenko@aquantia.com>
|
|
Signed-off-by: Sergey Samoilenko <sergey.samoilenko@aquantia.com>
|
|
Co-developed-by: Dmitry Bezrukov <dmitry.bezrukov@aquantia.com>
|
|
Signed-off-by: Dmitry Bezrukov <dmitry.bezrukov@aquantia.com>
|
|
Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.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/Makefile | 1 +
|
|
drivers/net/ethernet/aquantia/atlantic/aq_nic.c | 10 ++-
|
|
drivers/net/ethernet/aquantia/atlantic/aq_nic.h | 5 +-
|
|
drivers/net/ethernet/aquantia/atlantic/aq_ptp.c | 84 +++++++++++++++++++++
|
|
drivers/net/ethernet/aquantia/atlantic/aq_ptp.h | 22 ++++++
|
|
.../aquantia/atlantic/hw_atl/hw_atl_utils.h | 85 +++++++++++++++++++++-
|
|
6 files changed, 201 insertions(+), 6 deletions(-)
|
|
create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
|
|
create mode 100644 drivers/net/ethernet/aquantia/atlantic/aq_ptp.h
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/Makefile b/drivers/net/ethernet/aquantia/atlantic/Makefile
|
|
index 131cab855be7..cd12d9d824ec 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/Makefile
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/Makefile
|
|
@@ -24,6 +24,7 @@ atlantic-objs := aq_main.o \
|
|
aq_ethtool.o \
|
|
aq_drvinfo.o \
|
|
aq_filters.o \
|
|
+ aq_ptp.o \
|
|
hw_atl/hw_atl_a0.o \
|
|
hw_atl/hw_atl_b0.o \
|
|
hw_atl/hw_atl_utils.o \
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
index 137c1de4c6ec..d283d0bc75a3 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
|
|
@@ -1,7 +1,7 @@
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* aQuantia Corporation Network Driver
|
|
- * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
|
|
+ * Copyright (C) 2014-2019 aQuantia Corporation. All rights reserved
|
|
*/
|
|
|
|
/* File aq_nic.c: Definition of common code for NIC. */
|
|
@@ -12,6 +12,7 @@
|
|
#include "aq_hw.h"
|
|
#include "aq_pci_func.h"
|
|
#include "aq_main.h"
|
|
+#include "aq_ptp.h"
|
|
|
|
#include <linux/moduleparam.h>
|
|
#include <linux/netdevice.h>
|
|
@@ -331,6 +332,10 @@ int aq_nic_init(struct aq_nic_s *self)
|
|
self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
|
|
aq_vec_init(aq_vec, self->aq_hw_ops, self->aq_hw);
|
|
|
|
+ err = aq_ptp_init(self, self->irqvecs - 1);
|
|
+ if (err < 0)
|
|
+ goto err_exit;
|
|
+
|
|
netif_carrier_off(self->ndev);
|
|
|
|
err_exit:
|
|
@@ -972,6 +977,9 @@ void aq_nic_deinit(struct aq_nic_s *self)
|
|
self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i])
|
|
aq_vec_deinit(aq_vec);
|
|
|
|
+ aq_ptp_unregister(self);
|
|
+ aq_ptp_free(self);
|
|
+
|
|
if (likely(self->aq_fw_ops->deinit)) {
|
|
mutex_lock(&self->fwreq_mutex);
|
|
self->aq_fw_ops->deinit(self->aq_hw);
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
|
|
index 255b54a6ae07..d0979bba7ed3 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
|
|
@@ -1,7 +1,7 @@
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* aQuantia Corporation Network Driver
|
|
- * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
|
|
+ * Copyright (C) 2014-2019 aQuantia Corporation. All rights reserved
|
|
*/
|
|
|
|
/* File aq_nic.h: Declaration of common code for NIC. */
|
|
@@ -17,6 +17,7 @@ struct aq_ring_s;
|
|
struct aq_hw_ops;
|
|
struct aq_fw_s;
|
|
struct aq_vec_s;
|
|
+struct aq_ptp_s;
|
|
|
|
struct aq_nic_cfg_s {
|
|
const struct aq_hw_caps_s *aq_hw_caps;
|
|
@@ -108,6 +109,8 @@ struct aq_nic_s {
|
|
u32 irqvecs;
|
|
/* mutex to serialize FW interface access operations */
|
|
struct mutex fwreq_mutex;
|
|
+ /* PTP support */
|
|
+ struct aq_ptp_s *aq_ptp;
|
|
struct aq_hw_rx_fltrs_s aq_hw_rx_fltrs;
|
|
};
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
|
|
new file mode 100644
|
|
index 000000000000..a320916cced3
|
|
--- /dev/null
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.c
|
|
@@ -0,0 +1,84 @@
|
|
+// SPDX-License-Identifier: GPL-2.0-only
|
|
+/* Aquantia Corporation Network Driver
|
|
+ * Copyright (C) 2014-2019 Aquantia Corporation. All rights reserved
|
|
+ */
|
|
+
|
|
+/* File aq_ptp.c:
|
|
+ * Definition of functions for Linux PTP support.
|
|
+ */
|
|
+
|
|
+#include <linux/ptp_clock_kernel.h>
|
|
+#include <linux/clocksource.h>
|
|
+
|
|
+#include "aq_nic.h"
|
|
+#include "aq_ptp.h"
|
|
+
|
|
+struct aq_ptp_s {
|
|
+ struct aq_nic_s *aq_nic;
|
|
+ struct ptp_clock *ptp_clock;
|
|
+ struct ptp_clock_info ptp_info;
|
|
+};
|
|
+
|
|
+static struct ptp_clock_info aq_ptp_clock = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .name = "atlantic ptp",
|
|
+ .n_ext_ts = 0,
|
|
+ .pps = 0,
|
|
+ .n_per_out = 0,
|
|
+ .n_pins = 0,
|
|
+ .pin_config = NULL,
|
|
+};
|
|
+
|
|
+int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec)
|
|
+{
|
|
+ struct hw_atl_utils_mbox mbox;
|
|
+ struct aq_ptp_s *aq_ptp;
|
|
+ int err = 0;
|
|
+
|
|
+ hw_atl_utils_mpi_read_stats(aq_nic->aq_hw, &mbox);
|
|
+
|
|
+ if (!(mbox.info.caps_ex & BIT(CAPS_EX_PHY_PTP_EN))) {
|
|
+ aq_nic->aq_ptp = NULL;
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ aq_ptp = kzalloc(sizeof(*aq_ptp), GFP_KERNEL);
|
|
+ if (!aq_ptp) {
|
|
+ err = -ENOMEM;
|
|
+ goto err_exit;
|
|
+ }
|
|
+
|
|
+ aq_ptp->aq_nic = aq_nic;
|
|
+
|
|
+ aq_ptp->ptp_info = aq_ptp_clock;
|
|
+
|
|
+ aq_nic->aq_ptp = aq_ptp;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+err_exit:
|
|
+ kfree(aq_ptp);
|
|
+ aq_nic->aq_ptp = NULL;
|
|
+ return err;
|
|
+}
|
|
+
|
|
+void aq_ptp_unregister(struct aq_nic_s *aq_nic)
|
|
+{
|
|
+ struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp;
|
|
+
|
|
+ if (!aq_ptp)
|
|
+ return;
|
|
+
|
|
+ ptp_clock_unregister(aq_ptp->ptp_clock);
|
|
+}
|
|
+
|
|
+void aq_ptp_free(struct aq_nic_s *aq_nic)
|
|
+{
|
|
+ struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp;
|
|
+
|
|
+ if (!aq_ptp)
|
|
+ return;
|
|
+
|
|
+ kfree(aq_ptp);
|
|
+ aq_nic->aq_ptp = NULL;
|
|
+}
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ptp.h b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.h
|
|
new file mode 100644
|
|
index 000000000000..cea238959b20
|
|
--- /dev/null
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ptp.h
|
|
@@ -0,0 +1,22 @@
|
|
+/* SPDX-License-Identifier: GPL-2.0-only */
|
|
+/* Aquantia Corporation Network Driver
|
|
+ * Copyright (C) 2014-2019 Aquantia Corporation. All rights reserved
|
|
+ */
|
|
+
|
|
+/* File aq_ptp.h: Declaration of PTP functions.
|
|
+ */
|
|
+#ifndef AQ_PTP_H
|
|
+#define AQ_PTP_H
|
|
+
|
|
+#include <linux/net_tstamp.h>
|
|
+#include <linux/version.h>
|
|
+
|
|
+/* Common functions */
|
|
+int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec);
|
|
+
|
|
+void aq_ptp_unregister(struct aq_nic_s *aq_nic);
|
|
+void aq_ptp_free(struct aq_nic_s *aq_nic);
|
|
+
|
|
+void aq_ptp_clock_init(struct aq_nic_s *aq_nic);
|
|
+
|
|
+#endif /* AQ_PTP_H */
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h
|
|
index 692bed70e104..7121248954df 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h
|
|
@@ -1,7 +1,7 @@
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* aQuantia Corporation Network Driver
|
|
- * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
|
|
+ * Copyright (C) 2014-2019 aQuantia Corporation. All rights reserved
|
|
*/
|
|
|
|
/* File hw_atl_utils.h: Declaration of common functions for Atlantic hardware
|
|
@@ -168,6 +168,34 @@ struct __packed hw_atl_utils_mbox_header {
|
|
u32 error;
|
|
};
|
|
|
|
+struct __packed hw_aq_ptp_offset {
|
|
+ u16 ingress_100;
|
|
+ u16 egress_100;
|
|
+ u16 ingress_1000;
|
|
+ u16 egress_1000;
|
|
+ u16 ingress_2500;
|
|
+ u16 egress_2500;
|
|
+ u16 ingress_5000;
|
|
+ u16 egress_5000;
|
|
+ u16 ingress_10000;
|
|
+ u16 egress_10000;
|
|
+};
|
|
+
|
|
+enum gpio_pin_function {
|
|
+ GPIO_PIN_FUNCTION_NC,
|
|
+ GPIO_PIN_FUNCTION_VAUX_ENABLE,
|
|
+ GPIO_PIN_FUNCTION_EFUSE_BURN_ENABLE,
|
|
+ GPIO_PIN_FUNCTION_SFP_PLUS_DETECT,
|
|
+ GPIO_PIN_FUNCTION_TX_DISABLE,
|
|
+ GPIO_PIN_FUNCTION_RATE_SEL_0,
|
|
+ GPIO_PIN_FUNCTION_RATE_SEL_1,
|
|
+ GPIO_PIN_FUNCTION_TX_FAULT,
|
|
+ GPIO_PIN_FUNCTION_PTP0,
|
|
+ GPIO_PIN_FUNCTION_PTP1,
|
|
+ GPIO_PIN_FUNCTION_PTP2,
|
|
+ GPIO_PIN_FUNCTION_SIZE
|
|
+};
|
|
+
|
|
struct __packed hw_aq_info {
|
|
u8 reserved[6];
|
|
u16 phy_fault_code;
|
|
@@ -175,9 +203,23 @@ struct __packed hw_aq_info {
|
|
u8 cable_len;
|
|
u8 reserved1;
|
|
u32 cable_diag_data[4];
|
|
- u8 reserved2[32];
|
|
+ struct hw_aq_ptp_offset ptp_offset;
|
|
+ u8 reserved2[12];
|
|
u32 caps_lo;
|
|
u32 caps_hi;
|
|
+ u32 reserved_datapath;
|
|
+ u32 reserved3[7];
|
|
+ u32 reserved_simpleresp[3];
|
|
+ u32 reserved_linkstat[7];
|
|
+ u32 reserved_wakes_count;
|
|
+ u32 reserved_eee_stat[12];
|
|
+ u32 tx_stuck_cnt;
|
|
+ u32 setting_address;
|
|
+ u32 setting_length;
|
|
+ u32 caps_ex;
|
|
+ enum gpio_pin_function gpio_pin[3];
|
|
+ u32 pcie_aer_dump[18];
|
|
+ u16 snr_margin[4];
|
|
};
|
|
|
|
struct __packed hw_atl_utils_mbox {
|
|
@@ -372,7 +414,7 @@ enum hw_atl_fw2x_caps_hi {
|
|
CAPS_HI_2P5GBASET_FD_EEE,
|
|
CAPS_HI_5GBASET_FD_EEE,
|
|
CAPS_HI_10GBASET_FD_EEE,
|
|
- CAPS_HI_RESERVED5,
|
|
+ CAPS_HI_FW_REQUEST,
|
|
CAPS_HI_RESERVED6,
|
|
CAPS_HI_RESERVED7,
|
|
CAPS_HI_RESERVED8,
|
|
@@ -380,7 +422,7 @@ enum hw_atl_fw2x_caps_hi {
|
|
CAPS_HI_CABLE_DIAG,
|
|
CAPS_HI_TEMPERATURE,
|
|
CAPS_HI_DOWNSHIFT,
|
|
- CAPS_HI_PTP_AVB_EN,
|
|
+ CAPS_HI_PTP_AVB_EN_FW2X = 20,
|
|
CAPS_HI_MEDIA_DETECT,
|
|
CAPS_HI_LINK_DROP,
|
|
CAPS_HI_SLEEP_PROXY,
|
|
@@ -429,6 +471,41 @@ enum hw_atl_fw2x_ctrl {
|
|
CTRL_FORCE_RECONNECT,
|
|
};
|
|
|
|
+enum hw_atl_caps_ex {
|
|
+ CAPS_EX_LED_CONTROL = 0,
|
|
+ CAPS_EX_LED0_MODE_LO,
|
|
+ CAPS_EX_LED0_MODE_HI,
|
|
+ CAPS_EX_LED1_MODE_LO,
|
|
+ CAPS_EX_LED1_MODE_HI,
|
|
+ CAPS_EX_LED2_MODE_LO = 5,
|
|
+ CAPS_EX_LED2_MODE_HI,
|
|
+ CAPS_EX_RESERVED07,
|
|
+ CAPS_EX_RESERVED08,
|
|
+ CAPS_EX_RESERVED09,
|
|
+ CAPS_EX_RESERVED10 = 10,
|
|
+ CAPS_EX_RESERVED11,
|
|
+ CAPS_EX_RESERVED12,
|
|
+ CAPS_EX_RESERVED13,
|
|
+ CAPS_EX_RESERVED14,
|
|
+ CAPS_EX_RESERVED15 = 15,
|
|
+ CAPS_EX_PHY_PTP_EN,
|
|
+ CAPS_EX_MAC_PTP_EN,
|
|
+ CAPS_EX_EXT_CLK_EN,
|
|
+ CAPS_EX_SCHED_DMA_EN,
|
|
+ CAPS_EX_PTP_GPIO_EN = 20,
|
|
+ CAPS_EX_UPDATE_SETTINGS,
|
|
+ CAPS_EX_PHY_CTRL_TS_PIN,
|
|
+ CAPS_EX_SNR_OPERATING_MARGIN,
|
|
+ CAPS_EX_RESERVED24,
|
|
+ CAPS_EX_RESERVED25 = 25,
|
|
+ CAPS_EX_RESERVED26,
|
|
+ CAPS_EX_RESERVED27,
|
|
+ CAPS_EX_RESERVED28,
|
|
+ CAPS_EX_RESERVED29,
|
|
+ CAPS_EX_RESERVED30 = 30,
|
|
+ CAPS_EX_RESERVED31
|
|
+};
|
|
+
|
|
struct aq_hw_s;
|
|
struct aq_fw_ops;
|
|
struct aq_hw_caps_s;
|
|
--
|
|
2.13.6
|
|
|