]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 5 Dec 2021 14:23:35 +0000 (15:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 5 Dec 2021 14:23:35 +0000 (15:23 +0100)
added patches:
atlantic-add-missing-dids-and-fix-115c.patch
atlantic-fix-statistics-logic-for-production-hardware.patch
atlantic-fix-to-display-fw-bundle-version-instead-of-fw-mac-version.patch
atlantic-increase-delay-for-fw-transactions.patch
atlantic-remove-warn-trace-message.patch
atlatnic-enable-nbase-t-speeds-with-base-t.patch
remove-half-duplex-mode-speed-capabilities.patch

queue-5.15/atlantic-add-missing-dids-and-fix-115c.patch [new file with mode: 0644]
queue-5.15/atlantic-fix-statistics-logic-for-production-hardware.patch [new file with mode: 0644]
queue-5.15/atlantic-fix-to-display-fw-bundle-version-instead-of-fw-mac-version.patch [new file with mode: 0644]
queue-5.15/atlantic-increase-delay-for-fw-transactions.patch [new file with mode: 0644]
queue-5.15/atlantic-remove-warn-trace-message.patch [new file with mode: 0644]
queue-5.15/atlatnic-enable-nbase-t-speeds-with-base-t.patch [new file with mode: 0644]
queue-5.15/remove-half-duplex-mode-speed-capabilities.patch [new file with mode: 0644]
queue-5.15/series

diff --git a/queue-5.15/atlantic-add-missing-dids-and-fix-115c.patch b/queue-5.15/atlantic-add-missing-dids-and-fix-115c.patch
new file mode 100644 (file)
index 0000000..03796fd
--- /dev/null
@@ -0,0 +1,101 @@
+From 413d5e09caa5a11da9c7d72401ba0588466a04c0 Mon Sep 17 00:00:00 2001
+From: Nikita Danilov <ndanilov@aquantia.com>
+Date: Mon, 29 Nov 2021 05:28:26 -0800
+Subject: atlantic: Add missing DIDs and fix 115c.
+
+From: Nikita Danilov <ndanilov@aquantia.com>
+
+commit 413d5e09caa5a11da9c7d72401ba0588466a04c0 upstream.
+
+At the late production stages new dev ids were introduced. These are
+now in production, so its important for the driver to recognize these.
+And also fix the board caps for AQC115C adapter.
+
+Fixes: b3f0c79cba206 ("net: atlantic: A2 hw_ops skeleton")
+Signed-off-by: Nikita Danilov <ndanilov@aquantia.com>
+Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
+Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/aquantia/atlantic/aq_common.h       |    2 +
+ drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c     |    7 +++++-
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c |   17 +++++++++++++++
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.h |    2 +
+ 4 files changed, 27 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/aquantia/atlantic/aq_common.h
++++ b/drivers/net/ethernet/aquantia/atlantic/aq_common.h
+@@ -40,10 +40,12 @@
+ #define AQ_DEVICE_ID_AQC113DEV        0x00C0
+ #define AQ_DEVICE_ID_AQC113CS 0x94C0
++#define AQ_DEVICE_ID_AQC113CA 0x34C0
+ #define AQ_DEVICE_ID_AQC114CS 0x93C0
+ #define AQ_DEVICE_ID_AQC113   0x04C0
+ #define AQ_DEVICE_ID_AQC113C  0x14C0
+ #define AQ_DEVICE_ID_AQC115C  0x12C0
++#define AQ_DEVICE_ID_AQC116C  0x11C0
+ #define HW_ATL_NIC_NAME "Marvell (aQuantia) AQtion 10Gbit Network Adapter"
+--- a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
++++ b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
+@@ -49,6 +49,8 @@ static const struct pci_device_id aq_pci
+       { PCI_VDEVICE(AQUANTIA, AQ_DEVICE_ID_AQC113), },
+       { PCI_VDEVICE(AQUANTIA, AQ_DEVICE_ID_AQC113C), },
+       { PCI_VDEVICE(AQUANTIA, AQ_DEVICE_ID_AQC115C), },
++      { PCI_VDEVICE(AQUANTIA, AQ_DEVICE_ID_AQC113CA), },
++      { PCI_VDEVICE(AQUANTIA, AQ_DEVICE_ID_AQC116C), },
+       {}
+ };
+@@ -85,7 +87,10 @@ static const struct aq_board_revision_s
+       { AQ_DEVICE_ID_AQC113CS,        AQ_HWREV_ANY,   &hw_atl2_ops, &hw_atl2_caps_aqc113, },
+       { AQ_DEVICE_ID_AQC114CS,        AQ_HWREV_ANY,   &hw_atl2_ops, &hw_atl2_caps_aqc113, },
+       { AQ_DEVICE_ID_AQC113C,         AQ_HWREV_ANY,   &hw_atl2_ops, &hw_atl2_caps_aqc113, },
+-      { AQ_DEVICE_ID_AQC115C,         AQ_HWREV_ANY,   &hw_atl2_ops, &hw_atl2_caps_aqc113, },
++      { AQ_DEVICE_ID_AQC115C,         AQ_HWREV_ANY,   &hw_atl2_ops, &hw_atl2_caps_aqc115c, },
++      { AQ_DEVICE_ID_AQC113CA,        AQ_HWREV_ANY,   &hw_atl2_ops, &hw_atl2_caps_aqc113, },
++      { AQ_DEVICE_ID_AQC116C,         AQ_HWREV_ANY,   &hw_atl2_ops, &hw_atl2_caps_aqc116c, },
++
+ };
+ MODULE_DEVICE_TABLE(pci, aq_pci_tbl);
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c
+@@ -72,6 +72,23 @@ const struct aq_hw_caps_s hw_atl2_caps_a
+                         AQ_NIC_RATE_10M_HALF,
+ };
++const struct aq_hw_caps_s hw_atl2_caps_aqc115c = {
++      DEFAULT_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      |
++                        AQ_NIC_RATE_10M,
++};
++
++const struct aq_hw_caps_s hw_atl2_caps_aqc116c = {
++      DEFAULT_BOARD_BASIC_CAPABILITIES,
++      .media_type = AQ_HW_MEDIA_TYPE_TP,
++      .link_speed_msk = AQ_NIC_RATE_1G  |
++                        AQ_NIC_RATE_100M      |
++                        AQ_NIC_RATE_10M,
++};
++
+ static u32 hw_atl2_sem_act_rslvr_get(struct aq_hw_s *self)
+ {
+       return hw_atl_reg_glb_cpu_sem_get(self, HW_ATL2_FW_SM_ACT_RSLVR);
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.h
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.h
+@@ -9,6 +9,8 @@
+ #include "aq_common.h"
+ extern const struct aq_hw_caps_s hw_atl2_caps_aqc113;
++extern const struct aq_hw_caps_s hw_atl2_caps_aqc115c;
++extern const struct aq_hw_caps_s hw_atl2_caps_aqc116c;
+ extern const struct aq_hw_ops hw_atl2_ops;
+ #endif /* HW_ATL2_H */
diff --git a/queue-5.15/atlantic-fix-statistics-logic-for-production-hardware.patch b/queue-5.15/atlantic-fix-statistics-logic-for-production-hardware.patch
new file mode 100644 (file)
index 0000000..2ab17f1
--- /dev/null
@@ -0,0 +1,295 @@
+From 2087ced0fc3a6d45203925750a2b1bcd5402e639 Mon Sep 17 00:00:00 2001
+From: Dmitry Bogdanov <dbezrukov@marvell.com>
+Date: Mon, 29 Nov 2021 05:28:28 -0800
+Subject: atlantic: Fix statistics logic for production hardware
+
+From: Dmitry Bogdanov <dbezrukov@marvell.com>
+
+commit 2087ced0fc3a6d45203925750a2b1bcd5402e639 upstream.
+
+B0 is the main and widespread device revision of atlantic2 HW. In the
+current state, driver will incorrectly fetch the statistics for this
+revision.
+
+Fixes: 5cfd54d7dc186 ("net: atlantic: minimal A2 fw_ops")
+Signed-off-by: Dmitry Bogdanov <dbezrukov@marvell.com>
+Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
+Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/aquantia/atlantic/aq_hw.h                    |    2 
+ drivers/net/ethernet/aquantia/atlantic/aq_nic.c                   |   10 
+ drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c      |   15 +
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils.h    |   38 +++
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c |  101 ++++++++--
+ 5 files changed, 139 insertions(+), 27 deletions(-)
+
+--- a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
++++ b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
+@@ -80,6 +80,8 @@ struct aq_hw_link_status_s {
+ };
+ struct aq_stats_s {
++      u64 brc;
++      u64 btc;
+       u64 uprc;
+       u64 mprc;
+       u64 bprc;
+--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
++++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+@@ -903,8 +903,14 @@ u64 *aq_nic_get_stats(struct aq_nic_s *s
+       data[++i] = stats->mbtc;
+       data[++i] = stats->bbrc;
+       data[++i] = stats->bbtc;
+-      data[++i] = stats->ubrc + stats->mbrc + stats->bbrc;
+-      data[++i] = stats->ubtc + stats->mbtc + stats->bbtc;
++      if (stats->brc)
++              data[++i] = stats->brc;
++      else
++              data[++i] = stats->ubrc + stats->mbrc + stats->bbrc;
++      if (stats->btc)
++              data[++i] = stats->btc;
++      else
++              data[++i] = stats->ubtc + stats->mbtc + stats->bbtc;
+       data[++i] = stats->dma_pkt_rc;
+       data[++i] = stats->dma_pkt_tc;
+       data[++i] = stats->dma_oct_rc;
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c
+@@ -867,12 +867,20 @@ static int hw_atl_fw1x_deinit(struct aq_
+ int hw_atl_utils_update_stats(struct aq_hw_s *self)
+ {
+       struct aq_stats_s *cs = &self->curr_stats;
++      struct aq_stats_s curr_stats = *cs;
+       struct hw_atl_utils_mbox mbox;
++      bool corrupted_stats = false;
+       hw_atl_utils_mpi_read_stats(self, &mbox);
+-#define AQ_SDELTA(_N_) (self->curr_stats._N_ += \
+-                      mbox.stats._N_ - self->last_stats._N_)
++#define AQ_SDELTA(_N_)  \
++do { \
++      if (!corrupted_stats && \
++          ((s64)(mbox.stats._N_ - self->last_stats._N_)) >= 0) \
++              curr_stats._N_ += mbox.stats._N_ - self->last_stats._N_; \
++      else \
++              corrupted_stats = true; \
++} while (0)
+       if (self->aq_link_status.mbps) {
+               AQ_SDELTA(uprc);
+@@ -892,6 +900,9 @@ int hw_atl_utils_update_stats(struct aq_
+               AQ_SDELTA(bbrc);
+               AQ_SDELTA(bbtc);
+               AQ_SDELTA(dpc);
++
++              if (!corrupted_stats)
++                      *cs = curr_stats;
+       }
+ #undef AQ_SDELTA
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils.h
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils.h
+@@ -239,7 +239,8 @@ struct version_s {
+               u8 minor;
+               u16 build;
+       } phy;
+-      u32 rsvd;
++      u32 drv_iface_ver:4;
++      u32 rsvd:28;
+ };
+ struct link_status_s {
+@@ -424,7 +425,7 @@ struct cable_diag_status_s {
+       u16 rsvd2;
+ };
+-struct statistics_s {
++struct statistics_a0_s {
+       struct {
+               u32 link_up;
+               u32 link_down;
+@@ -457,6 +458,33 @@ struct statistics_s {
+       u32 reserve_fw_gap;
+ };
++struct __packed statistics_b0_s {
++      u64 rx_good_octets;
++      u64 rx_pause_frames;
++      u64 rx_good_frames;
++      u64 rx_errors;
++      u64 rx_unicast_frames;
++      u64 rx_multicast_frames;
++      u64 rx_broadcast_frames;
++
++      u64 tx_good_octets;
++      u64 tx_pause_frames;
++      u64 tx_good_frames;
++      u64 tx_errors;
++      u64 tx_unicast_frames;
++      u64 tx_multicast_frames;
++      u64 tx_broadcast_frames;
++
++      u32 main_loop_cycles;
++};
++
++struct __packed statistics_s {
++      union __packed {
++              struct statistics_a0_s a0;
++              struct statistics_b0_s b0;
++      };
++};
++
+ struct filter_caps_s {
+       u8 l2_filters_base_index:6;
+       u8 flexible_filter_mask:2;
+@@ -545,7 +573,7 @@ struct management_status_s {
+       u32 rsvd5;
+ };
+-struct fw_interface_out {
++struct __packed fw_interface_out {
+       struct transaction_counter_s transaction_id;
+       struct version_s version;
+       struct link_status_s link_status;
+@@ -569,7 +597,6 @@ struct fw_interface_out {
+       struct core_dump_s core_dump;
+       u32 rsvd11;
+       struct statistics_s stats;
+-      u32 rsvd12;
+       struct filter_caps_s filter_caps;
+       struct device_caps_s device_caps;
+       u32 rsvd13;
+@@ -592,6 +619,9 @@ struct fw_interface_out {
+ #define  AQ_HOST_MODE_LOW_POWER    3U
+ #define  AQ_HOST_MODE_SHUTDOWN     4U
++#define  AQ_A2_FW_INTERFACE_A0     0
++#define  AQ_A2_FW_INTERFACE_B0     1
++
+ int hw_atl2_utils_initfw(struct aq_hw_s *self, const struct aq_fw_ops **fw_ops);
+ int hw_atl2_utils_soft_reset(struct aq_hw_s *self);
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
+@@ -333,18 +333,22 @@ static int aq_a2_fw_get_mac_permanent(st
+       return 0;
+ }
+-static int aq_a2_fw_update_stats(struct aq_hw_s *self)
++static void aq_a2_fill_a0_stats(struct aq_hw_s *self,
++                              struct statistics_s *stats)
+ {
+       struct hw_atl2_priv *priv = (struct hw_atl2_priv *)self->priv;
+-      struct statistics_s stats;
+-      int err;
+-
+-      err = hw_atl2_shared_buffer_read_safe(self, stats, &stats);
+-      if (err)
+-              return err;
+-
+-#define AQ_SDELTA(_N_, _F_) (self->curr_stats._N_ += \
+-                      stats.msm._F_ - priv->last_stats.msm._F_)
++      struct aq_stats_s *cs = &self->curr_stats;
++      struct aq_stats_s curr_stats = *cs;
++      bool corrupted_stats = false;
++
++#define AQ_SDELTA(_N, _F)  \
++do { \
++      if (!corrupted_stats && \
++          ((s64)(stats->a0.msm._F - priv->last_stats.a0.msm._F)) >= 0) \
++              curr_stats._N += stats->a0.msm._F - priv->last_stats.a0.msm._F;\
++      else \
++              corrupted_stats = true; \
++} while (0)
+       if (self->aq_link_status.mbps) {
+               AQ_SDELTA(uprc, rx_unicast_frames);
+@@ -363,17 +367,76 @@ static int aq_a2_fw_update_stats(struct
+               AQ_SDELTA(mbtc, tx_multicast_octets);
+               AQ_SDELTA(bbrc, rx_broadcast_octets);
+               AQ_SDELTA(bbtc, tx_broadcast_octets);
++
++              if (!corrupted_stats)
++                      *cs = curr_stats;
++      }
++#undef AQ_SDELTA
++
++}
++
++static void aq_a2_fill_b0_stats(struct aq_hw_s *self,
++                              struct statistics_s *stats)
++{
++      struct hw_atl2_priv *priv = (struct hw_atl2_priv *)self->priv;
++      struct aq_stats_s *cs = &self->curr_stats;
++      struct aq_stats_s curr_stats = *cs;
++      bool corrupted_stats = false;
++
++#define AQ_SDELTA(_N, _F)  \
++do { \
++      if (!corrupted_stats && \
++          ((s64)(stats->b0._F - priv->last_stats.b0._F)) >= 0) \
++              curr_stats._N += stats->b0._F - priv->last_stats.b0._F; \
++      else \
++              corrupted_stats = true; \
++} while (0)
++
++      if (self->aq_link_status.mbps) {
++              AQ_SDELTA(uprc, rx_unicast_frames);
++              AQ_SDELTA(mprc, rx_multicast_frames);
++              AQ_SDELTA(bprc, rx_broadcast_frames);
++              AQ_SDELTA(erpr, rx_errors);
++              AQ_SDELTA(brc, rx_good_octets);
++
++              AQ_SDELTA(uptc, tx_unicast_frames);
++              AQ_SDELTA(mptc, tx_multicast_frames);
++              AQ_SDELTA(bptc, tx_broadcast_frames);
++              AQ_SDELTA(erpt, tx_errors);
++              AQ_SDELTA(btc, tx_good_octets);
++
++              if (!corrupted_stats)
++                      *cs = curr_stats;
+       }
+ #undef AQ_SDELTA
+-      self->curr_stats.dma_pkt_rc =
+-              hw_atl_stats_rx_dma_good_pkt_counter_get(self);
+-      self->curr_stats.dma_pkt_tc =
+-              hw_atl_stats_tx_dma_good_pkt_counter_get(self);
+-      self->curr_stats.dma_oct_rc =
+-              hw_atl_stats_rx_dma_good_octet_counter_get(self);
+-      self->curr_stats.dma_oct_tc =
+-              hw_atl_stats_tx_dma_good_octet_counter_get(self);
+-      self->curr_stats.dpc = hw_atl_rpb_rx_dma_drop_pkt_cnt_get(self);
++}
++
++static int aq_a2_fw_update_stats(struct aq_hw_s *self)
++{
++      struct hw_atl2_priv *priv = (struct hw_atl2_priv *)self->priv;
++      struct aq_stats_s *cs = &self->curr_stats;
++      struct statistics_s stats;
++      struct version_s version;
++      int err;
++
++      err = hw_atl2_shared_buffer_read_safe(self, version, &version);
++      if (err)
++              return err;
++
++      err = hw_atl2_shared_buffer_read_safe(self, stats, &stats);
++      if (err)
++              return err;
++
++      if (version.drv_iface_ver == AQ_A2_FW_INTERFACE_A0)
++              aq_a2_fill_a0_stats(self, &stats);
++      else
++              aq_a2_fill_b0_stats(self, &stats);
++
++      cs->dma_pkt_rc = hw_atl_stats_rx_dma_good_pkt_counter_get(self);
++      cs->dma_pkt_tc = hw_atl_stats_tx_dma_good_pkt_counter_get(self);
++      cs->dma_oct_rc = hw_atl_stats_rx_dma_good_octet_counter_get(self);
++      cs->dma_oct_tc = hw_atl_stats_tx_dma_good_octet_counter_get(self);
++      cs->dpc = hw_atl_rpb_rx_dma_drop_pkt_cnt_get(self);
+       memcpy(&priv->last_stats, &stats, sizeof(stats));
diff --git a/queue-5.15/atlantic-fix-to-display-fw-bundle-version-instead-of-fw-mac-version.patch b/queue-5.15/atlantic-fix-to-display-fw-bundle-version-instead-of-fw-mac-version.patch
new file mode 100644 (file)
index 0000000..09cc0b5
--- /dev/null
@@ -0,0 +1,37 @@
+From 2465c802232bc8d2b5bd83b55b08d05c11808704 Mon Sep 17 00:00:00 2001
+From: Sameer Saurabh <ssaurabh@marvell.com>
+Date: Mon, 29 Nov 2021 05:28:25 -0800
+Subject: atlantic: Fix to display FW bundle version instead of FW mac version.
+
+From: Sameer Saurabh <ssaurabh@marvell.com>
+
+commit 2465c802232bc8d2b5bd83b55b08d05c11808704 upstream.
+
+The correct way to reflect firmware version is to use bundle version.
+Hence populating the same instead of MAC fw version.
+
+Fixes: c1be0bf092bd2 ("net: atlantic: common functions needed for basic A2 init/deinit hw_ops")
+Signed-off-by: Sameer Saurabh <ssaurabh@marvell.com>
+Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
+Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
+@@ -500,9 +500,9 @@ u32 hw_atl2_utils_get_fw_version(struct
+       hw_atl2_shared_buffer_read_safe(self, version, &version);
+       /* A2 FW version is stored in reverse order */
+-      return version.mac.major << 24 |
+-             version.mac.minor << 16 |
+-             version.mac.build;
++      return version.bundle.major << 24 |
++             version.bundle.minor << 16 |
++             version.bundle.build;
+ }
+ int hw_atl2_utils_get_action_resolve_table_caps(struct aq_hw_s *self,
diff --git a/queue-5.15/atlantic-increase-delay-for-fw-transactions.patch b/queue-5.15/atlantic-increase-delay-for-fw-transactions.patch
new file mode 100644 (file)
index 0000000..ef94301
--- /dev/null
@@ -0,0 +1,49 @@
+From aa1dcb5646fdf34a15763facf4bf5e482a2814ca Mon Sep 17 00:00:00 2001
+From: Dmitry Bogdanov <dbezrukov@marvell.com>
+Date: Mon, 29 Nov 2021 05:28:23 -0800
+Subject: atlantic: Increase delay for fw transactions
+
+From: Dmitry Bogdanov <dbezrukov@marvell.com>
+
+commit aa1dcb5646fdf34a15763facf4bf5e482a2814ca upstream.
+
+The max waiting period (of 1 ms) while reading the data from FW shared
+buffer is too small for certain types of data (e.g., stats). There's a
+chance that FW could be updating buffer at the same time and driver
+would be unsuccessful in reading data. Firmware manual recommends to
+have 1 sec timeout to fix this issue.
+
+Fixes: 5cfd54d7dc186 ("net: atlantic: minimal A2 fw_ops")
+Signed-off-by: Dmitry Bogdanov <dbezrukov@marvell.com>
+Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
+Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c |    7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
+@@ -84,7 +84,7 @@ static int hw_atl2_shared_buffer_read_bl
+                       if (cnt > AQ_A2_FW_READ_TRY_MAX)
+                               return -ETIME;
+                       if (tid1.transaction_cnt_a != tid1.transaction_cnt_b)
+-                              udelay(1);
++                              mdelay(1);
+               } while (tid1.transaction_cnt_a != tid1.transaction_cnt_b);
+               hw_atl2_mif_shared_buf_read(self, offset, (u32 *)data, dwords);
+@@ -339,8 +339,11 @@ static int aq_a2_fw_update_stats(struct
+ {
+       struct hw_atl2_priv *priv = (struct hw_atl2_priv *)self->priv;
+       struct statistics_s stats;
++      int err;
+-      hw_atl2_shared_buffer_read_safe(self, stats, &stats);
++      err = hw_atl2_shared_buffer_read_safe(self, stats, &stats);
++      if (err)
++              return err;
+ #define AQ_SDELTA(_N_, _F_) (self->curr_stats._N_ += \
+                       stats.msm._F_ - priv->last_stats.msm._F_)
diff --git a/queue-5.15/atlantic-remove-warn-trace-message.patch b/queue-5.15/atlantic-remove-warn-trace-message.patch
new file mode 100644 (file)
index 0000000..b012e15
--- /dev/null
@@ -0,0 +1,34 @@
+From 060a0fb721ec5bbe02ae322e434ec87dc25ed6e9 Mon Sep 17 00:00:00 2001
+From: Sameer Saurabh <ssaurabh@marvell.com>
+Date: Mon, 29 Nov 2021 05:28:29 -0800
+Subject: atlantic: Remove warn trace message.
+
+From: Sameer Saurabh <ssaurabh@marvell.com>
+
+commit 060a0fb721ec5bbe02ae322e434ec87dc25ed6e9 upstream.
+
+Remove the warn trace message - it's not a correct check here, because
+the function can still be called on the device in DOWN state
+
+Fixes: 508f2e3dce454 ("net: atlantic: split rx and tx per-queue stats")
+Signed-off-by: Sameer Saurabh <ssaurabh@marvell.com>
+Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
+Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/aquantia/atlantic/aq_vec.c |    3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
++++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
+@@ -362,9 +362,6 @@ unsigned int aq_vec_get_sw_stats(struct
+ {
+       unsigned int count;
+-      WARN_ONCE(!aq_vec_is_valid_tc(self, tc),
+-                "Invalid tc %u (#rx=%u, #tx=%u)\n",
+-                tc, self->rx_rings, self->tx_rings);
+       if (!aq_vec_is_valid_tc(self, tc))
+               return 0;
diff --git a/queue-5.15/atlatnic-enable-nbase-t-speeds-with-base-t.patch b/queue-5.15/atlatnic-enable-nbase-t-speeds-with-base-t.patch
new file mode 100644 (file)
index 0000000..37e8459
--- /dev/null
@@ -0,0 +1,92 @@
+From aa685acd98eae25d5351e30288d6cfb65b9c80a5 Mon Sep 17 00:00:00 2001
+From: Nikita Danilov <ndanilov@aquantia.com>
+Date: Mon, 29 Nov 2021 05:28:24 -0800
+Subject: atlatnic: enable Nbase-t speeds with base-t
+
+From: Nikita Danilov <ndanilov@aquantia.com>
+
+commit aa685acd98eae25d5351e30288d6cfb65b9c80a5 upstream.
+
+When 2.5G is advertised, N-Base should be advertised against the T-base
+caps. N5G is out of use in baseline code and driver should treat both 5G
+and N5G (and also 2.5G and N2.5G) equally from user perspective.
+
+Fixes: 5cfd54d7dc186 ("net: atlantic: minimal A2 fw_ops")
+Signed-off-by: Nikita Danilov <ndanilov@aquantia.com>
+Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
+Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/aquantia/atlantic/aq_common.h                |   25 ++++------
+ drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c |    3 -
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c |    4 -
+ 3 files changed, 13 insertions(+), 19 deletions(-)
+
+--- a/drivers/net/ethernet/aquantia/atlantic/aq_common.h
++++ b/drivers/net/ethernet/aquantia/atlantic/aq_common.h
+@@ -53,20 +53,19 @@
+ #define AQ_NIC_RATE_10G               BIT(0)
+ #define AQ_NIC_RATE_5G                BIT(1)
+-#define AQ_NIC_RATE_5GSR      BIT(2)
+-#define AQ_NIC_RATE_2G5               BIT(3)
+-#define AQ_NIC_RATE_1G                BIT(4)
+-#define AQ_NIC_RATE_100M      BIT(5)
+-#define AQ_NIC_RATE_10M               BIT(6)
+-#define AQ_NIC_RATE_1G_HALF   BIT(7)
+-#define AQ_NIC_RATE_100M_HALF BIT(8)
+-#define AQ_NIC_RATE_10M_HALF  BIT(9)
++#define AQ_NIC_RATE_2G5               BIT(2)
++#define AQ_NIC_RATE_1G                BIT(3)
++#define AQ_NIC_RATE_100M      BIT(4)
++#define AQ_NIC_RATE_10M               BIT(5)
++#define AQ_NIC_RATE_1G_HALF   BIT(6)
++#define AQ_NIC_RATE_100M_HALF BIT(7)
++#define AQ_NIC_RATE_10M_HALF  BIT(8)
+-#define AQ_NIC_RATE_EEE_10G   BIT(10)
+-#define AQ_NIC_RATE_EEE_5G    BIT(11)
+-#define AQ_NIC_RATE_EEE_2G5   BIT(12)
+-#define AQ_NIC_RATE_EEE_1G    BIT(13)
+-#define AQ_NIC_RATE_EEE_100M  BIT(14)
++#define AQ_NIC_RATE_EEE_10G   BIT(9)
++#define AQ_NIC_RATE_EEE_5G    BIT(10)
++#define AQ_NIC_RATE_EEE_2G5   BIT(11)
++#define AQ_NIC_RATE_EEE_1G    BIT(12)
++#define AQ_NIC_RATE_EEE_100M  BIT(13)
+ #define AQ_NIC_RATE_EEE_MSK     (AQ_NIC_RATE_EEE_10G |\
+                                AQ_NIC_RATE_EEE_5G |\
+                                AQ_NIC_RATE_EEE_2G5 |\
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c
+@@ -132,9 +132,6 @@ static enum hw_atl_fw2x_rate link_speed_
+       if (speed & AQ_NIC_RATE_5G)
+               rate |= FW2X_RATE_5G;
+-      if (speed & AQ_NIC_RATE_5GSR)
+-              rate |= FW2X_RATE_5G;
+-
+       if (speed & AQ_NIC_RATE_2G5)
+               rate |= FW2X_RATE_2G5;
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c
+@@ -154,7 +154,7 @@ static void a2_link_speed_mask2fw(u32 sp
+ {
+       link_options->rate_10G = !!(speed & AQ_NIC_RATE_10G);
+       link_options->rate_5G = !!(speed & AQ_NIC_RATE_5G);
+-      link_options->rate_N5G = !!(speed & AQ_NIC_RATE_5GSR);
++      link_options->rate_N5G = link_options->rate_5G;
+       link_options->rate_2P5G = !!(speed & AQ_NIC_RATE_2G5);
+       link_options->rate_N2P5G = link_options->rate_2P5G;
+       link_options->rate_1G = !!(speed & AQ_NIC_RATE_1G);
+@@ -192,8 +192,6 @@ static u32 a2_fw_lkp_to_mask(struct lkp_
+               rate |= AQ_NIC_RATE_10G;
+       if (lkp_link_caps->rate_5G)
+               rate |= AQ_NIC_RATE_5G;
+-      if (lkp_link_caps->rate_N5G)
+-              rate |= AQ_NIC_RATE_5GSR;
+       if (lkp_link_caps->rate_2P5G)
+               rate |= AQ_NIC_RATE_2G5;
+       if (lkp_link_caps->rate_1G)
diff --git a/queue-5.15/remove-half-duplex-mode-speed-capabilities.patch b/queue-5.15/remove-half-duplex-mode-speed-capabilities.patch
new file mode 100644 (file)
index 0000000..f268a27
--- /dev/null
@@ -0,0 +1,37 @@
+From 03fa512189eb9b55ded5f3e81ad638315555b340 Mon Sep 17 00:00:00 2001
+From: Sameer Saurabh <ssaurabh@marvell.com>
+Date: Mon, 29 Nov 2021 05:28:27 -0800
+Subject: Remove Half duplex mode speed capabilities.
+
+From: Sameer Saurabh <ssaurabh@marvell.com>
+
+commit 03fa512189eb9b55ded5f3e81ad638315555b340 upstream.
+
+Since Half Duplex mode has been deprecated by the firmware, driver should
+not advertise Half Duplex speed in ethtool support link speed values.
+
+Fixes: 071a02046c262 ("net: atlantic: A2: half duplex support")
+Signed-off-by: Sameer Saurabh <ssaurabh@marvell.com>
+Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
+Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c |    5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c
++++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c
+@@ -65,11 +65,8 @@ const struct aq_hw_caps_s hw_atl2_caps_a
+                         AQ_NIC_RATE_5G  |
+                         AQ_NIC_RATE_2G5 |
+                         AQ_NIC_RATE_1G  |
+-                        AQ_NIC_RATE_1G_HALF   |
+                         AQ_NIC_RATE_100M      |
+-                        AQ_NIC_RATE_100M_HALF |
+-                        AQ_NIC_RATE_10M       |
+-                        AQ_NIC_RATE_10M_HALF,
++                        AQ_NIC_RATE_10M,
+ };
+ const struct aq_hw_caps_s hw_atl2_caps_aqc115c = {
index 606b8ff29a28386ba4ec8efb137e78ca54aaf381..55d4ebd554568823b75fd9682d5433c226d1f799 100644 (file)
@@ -142,3 +142,10 @@ drm-vc4-kms-add-missing-drm_crtc_commit_put.patch
 drm-vc4-kms-clear-the-hvs-fifo-commit-pointer-once-done.patch
 drm-vc4-kms-don-t-duplicate-pending-commit.patch
 drm-vc4-kms-fix-previous-hvs-commit-wait.patch
+atlantic-increase-delay-for-fw-transactions.patch
+atlatnic-enable-nbase-t-speeds-with-base-t.patch
+atlantic-fix-to-display-fw-bundle-version-instead-of-fw-mac-version.patch
+atlantic-add-missing-dids-and-fix-115c.patch
+remove-half-duplex-mode-speed-capabilities.patch
+atlantic-fix-statistics-logic-for-production-hardware.patch
+atlantic-remove-warn-trace-message.patch