]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net: atlantic: add support for 64-bit reads/writes
authorPavel Belous <pbelous@marvell.com>
Mon, 20 Jul 2020 18:32:40 +0000 (21:32 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 21 Jul 2020 01:07:38 +0000 (18:07 -0700)
This patch adds support for 64-bit reads/writes where applicable, e.g.
A2 supports them.

Signed-off-by: Pavel Belous <pbelous@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>
drivers/net/ethernet/aquantia/atlantic/aq_hw.h
drivers/net/ethernet/aquantia/atlantic/aq_hw_utils.c
drivers/net/ethernet/aquantia/atlantic/aq_hw_utils.h
drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c
drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2.c

index 284ea943e8cd323f9cf00349a306446eb355951b..96d59ee3eb7050473e66edf9835f9856bb72e10c 100644 (file)
@@ -67,6 +67,7 @@ struct aq_hw_caps_s {
        u8 rx_rings;
        bool flow_control;
        bool is_64_dma;
+       bool op64bit;
        u32 priv_data_len;
 };
 
index 342c5179f846920bb0eea684bbbce9c119c889b8..ae85c0a7d238522fd6c7fe51054d23871162500f 100644 (file)
@@ -1,7 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0-only
-/*
- * aQuantia Corporation Network Driver
- * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+/* Atlantic Network Driver
+ *
+ * Copyright (C) 2014-2019 aQuantia Corporation
+ * Copyright (C) 2019-2020 Marvell International Ltd.
  */
 
 /* File aq_hw_utils.c: Definitions of helper functions used across
@@ -9,6 +10,9 @@
  */
 
 #include "aq_hw_utils.h"
+
+#include <linux/io-64-nonatomic-lo-hi.h>
+
 #include "aq_hw.h"
 #include "aq_nic.h"
 
@@ -56,13 +60,28 @@ void aq_hw_write_reg(struct aq_hw_s *hw, u32 reg, u32 value)
  */
 u64 aq_hw_read_reg64(struct aq_hw_s *hw, u32 reg)
 {
-       u64 value = aq_hw_read_reg(hw, reg);
+       u64 value = U64_MAX;
 
-       value |= (u64)aq_hw_read_reg(hw, reg + 4) << 32;
+       if (hw->aq_nic_cfg->aq_hw_caps->op64bit)
+               value = readq(hw->mmio + reg);
+       else
+               value = lo_hi_readq(hw->mmio + reg);
+
+       if (value == U64_MAX &&
+           readl(hw->mmio + hw->aq_nic_cfg->aq_hw_caps->hw_alive_check_addr) == U32_MAX)
+               aq_utils_obj_set(&hw->flags, AQ_HW_FLAG_ERR_UNPLUG);
 
        return value;
 }
 
+void aq_hw_write_reg64(struct aq_hw_s *hw, u32 reg, u64 value)
+{
+       if (hw->aq_nic_cfg->aq_hw_caps->op64bit)
+               writeq(value, hw->mmio + reg);
+       else
+               lo_hi_writeq(value, hw->mmio + reg);
+}
+
 int aq_hw_err_from_flags(struct aq_hw_s *hw)
 {
        int err = 0;
index 32aa5f2fb84060d9d3985b57c9f2602778daa6ac..ffa6e4067c21187f206079667d867475d380f609 100644 (file)
@@ -1,7 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * aQuantia Corporation Network Driver
- * Copyright (C) 2014-2017 aQuantia Corporation. All rights reserved
+/* Atlantic Network Driver
+ *
+ * Copyright (C) 2014-2019 aQuantia Corporation
+ * Copyright (C) 2019-2020 Marvell International Ltd.
  */
 
 /* File aq_hw_utils.h: Declaration of helper functions used across hardware
@@ -33,6 +34,7 @@ u32 aq_hw_read_reg_bit(struct aq_hw_s *aq_hw, u32 addr, u32 msk, u32 shift);
 u32 aq_hw_read_reg(struct aq_hw_s *hw, u32 reg);
 void aq_hw_write_reg(struct aq_hw_s *hw, u32 reg, u32 value);
 u64 aq_hw_read_reg64(struct aq_hw_s *hw, u32 reg);
+void aq_hw_write_reg64(struct aq_hw_s *hw, u32 reg, u64 value);
 int aq_hw_err_from_flags(struct aq_hw_s *hw);
 int aq_hw_num_tcs(struct aq_hw_s *hw);
 int aq_hw_q_per_tc(struct aq_hw_s *hw);
index a312864969afe0fba5182413089881fb0125a4d2..8f8b90436ced08afd8f529d07ea29d3aa90f9b2d 100644 (file)
@@ -18,6 +18,7 @@
 
 #define DEFAULT_A0_BOARD_BASIC_CAPABILITIES \
        .is_64_dma = true,                \
+       .op64bit = false,                 \
        .msix_irqs = 4U,                  \
        .irq_mask = ~0U,                  \
        .vecs = HW_ATL_A0_RSS_MAX,        \
index 51c8962b7a0e194005d46b0a0f17b8a868d906f5..ee74cad4a168920d056e82c1bcdfdef3738c9b83 100644 (file)
@@ -20,6 +20,7 @@
 
 #define DEFAULT_B0_BOARD_BASIC_CAPABILITIES \
        .is_64_dma = true,                \
+       .op64bit = false,                 \
        .msix_irqs = 8U,                  \
        .irq_mask = ~0U,                  \
        .vecs = HW_ATL_B0_RSS_MAX,        \
index c65e6daad0e55c0682d81108fa09dbbc09a1a3dd..92f64048bf691e7014d009f531eaafb339efe5f9 100644 (file)
@@ -21,6 +21,7 @@ static int hw_atl2_act_rslvr_table_set(struct aq_hw_s *self, u8 location,
 
 #define DEFAULT_BOARD_BASIC_CAPABILITIES \
        .is_64_dma = true,                \
+       .op64bit = true,                  \
        .msix_irqs = 8U,                  \
        .irq_mask = ~0U,                  \
        .vecs = HW_ATL2_RSS_MAX,          \