The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/alpine-hal/eth/al_hal_eth_main.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2 *******************************************************************************
    3 Copyright (C) 2015 Annapurna Labs Ltd.
    4 
    5 This file may be licensed under the terms of the Annapurna Labs Commercial
    6 License Agreement.
    7 
    8 Alternatively, this file can be distributed under the terms of the GNU General
    9 Public License V2 as published by the Free Software Foundation and can be
   10 found at http://www.gnu.org/licenses/gpl-2.0.html
   11 
   12 Alternatively, redistribution and use in source and binary forms, with or
   13 without modification, are permitted provided that the following conditions are
   14 met:
   15 
   16     *     Redistributions of source code must retain the above copyright notice,
   17 this list of conditions and the following disclaimer.
   18 
   19     *     Redistributions in binary form must reproduce the above copyright
   20 notice, this list of conditions and the following disclaimer in
   21 the documentation and/or other materials provided with the
   22 distribution.
   23 
   24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   25 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
   28 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
   31 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   34 
   35 *******************************************************************************/
   36 
   37 /**
   38  *  @{
   39  * @file   al_hal_eth_main.c
   40  *
   41  * @brief  XG Ethernet unit HAL driver for main functions (initialization, data path)
   42  *
   43  */
   44 
   45 #include "al_hal_eth.h"
   46 #include "al_hal_udma_iofic.h"
   47 #include "al_hal_udma_config.h"
   48 #include "al_hal_eth_ec_regs.h"
   49 #include "al_hal_eth_mac_regs.h"
   50 #include "al_hal_unit_adapter_regs.h"
   51 #ifdef AL_ETH_EX
   52 #include "al_hal_eth_ex_internal.h"
   53 #endif
   54 
   55 /* Number of xfi_txclk cycles that accumulate into 100ns */
   56 #define ETH_MAC_KR_10_PCS_CFG_EEE_TIMER_VAL 52
   57 #define ETH_MAC_KR_25_PCS_CFG_EEE_TIMER_VAL 80
   58 #define ETH_MAC_XLG_40_PCS_CFG_EEE_TIMER_VAL 63
   59 #define ETH_MAC_XLG_50_PCS_CFG_EEE_TIMER_VAL 85
   60 
   61 #define AL_ETH_TX_PKT_UDMA_FLAGS        (AL_ETH_TX_FLAGS_NO_SNOOP | \
   62                                          AL_ETH_TX_FLAGS_INT)
   63 
   64 #define AL_ETH_TX_PKT_META_FLAGS        (AL_ETH_TX_FLAGS_IPV4_L3_CSUM | \
   65                                          AL_ETH_TX_FLAGS_L4_CSUM |      \
   66                                          AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM |      \
   67                                          AL_ETH_TX_FLAGS_L2_MACSEC_PKT | \
   68                                          AL_ETH_TX_FLAGS_L2_DIS_FCS |\
   69                                          AL_ETH_TX_FLAGS_TSO |\
   70                                          AL_ETH_TX_FLAGS_TS)
   71 
   72 #define AL_ETH_TX_SRC_VLAN_CNT_MASK     3
   73 #define AL_ETH_TX_SRC_VLAN_CNT_SHIFT    5
   74 #define AL_ETH_TX_L4_PROTO_IDX_MASK     0x1F
   75 #define AL_ETH_TX_L4_PROTO_IDX_SHIFT    8
   76 #define AL_ETH_TX_TUNNEL_MODE_SHIFT             18
   77 #define AL_ETH_TX_OUTER_L3_PROTO_SHIFT          20
   78 #define AL_ETH_TX_VLAN_MOD_ADD_SHIFT            22
   79 #define AL_ETH_TX_VLAN_MOD_DEL_SHIFT            24
   80 #define AL_ETH_TX_VLAN_MOD_E_SEL_SHIFT          26
   81 #define AL_ETH_TX_VLAN_MOD_VID_SEL_SHIFT        28
   82 #define AL_ETH_TX_VLAN_MOD_PBIT_SEL_SHIFT       30
   83 
   84 /* tx Meta Descriptor defines */
   85 #define AL_ETH_TX_META_STORE                    (1 << 21)
   86 #define AL_ETH_TX_META_L3_LEN_MASK              0xff
   87 #define AL_ETH_TX_META_L3_OFF_MASK              0xff
   88 #define AL_ETH_TX_META_L3_OFF_SHIFT             8
   89 #define AL_ETH_TX_META_MSS_LSB_VAL_SHIFT        22
   90 #define AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT     16
   91 #define AL_ETH_TX_META_OUTER_L3_LEN_MASK        0x1f
   92 #define AL_ETH_TX_META_OUTER_L3_LEN_SHIFT       24
   93 #define AL_ETH_TX_META_OUTER_L3_OFF_HIGH_MASK   0x18
   94 #define AL_ETH_TX_META_OUTER_L3_OFF_HIGH_SHIFT  10
   95 #define AL_ETH_TX_META_OUTER_L3_OFF_LOW_MASK    0x07
   96 #define AL_ETH_TX_META_OUTER_L3_OFF_LOW_SHIFT   29
   97 
   98 /* tx Meta Descriptor defines - MacSec */
   99 #define AL_ETH_TX_MACSEC_SIGN_SHIFT                       0             /* Sign TX pkt */
  100 #define AL_ETH_TX_MACSEC_ENCRYPT_SHIFT                    1             /* Encrypt TX pkt */
  101 #define AL_ETH_TX_MACSEC_AN_LSB_SHIFT                     2             /* Association Number */
  102 #define AL_ETH_TX_MACSEC_AN_MSB_SHIFT                     3
  103 #define AL_ETH_TX_MACSEC_SC_LSB_SHIFT                     4             /* Secured Channel */
  104 #define AL_ETH_TX_MACSEC_SC_MSB_SHIFT                     9
  105 #define AL_ETH_TX_MACSEC_SECURED_PYLD_LEN_LSB_SHIFT      10             /* Secure Payload Length (0x3FFF for non-SL packets) */
  106 #define AL_ETH_TX_MACSEC_SECURED_PYLD_LEN_MSB_SHIFT      23
  107 
  108 /* Rx Descriptor defines */
  109 #define AL_ETH_RX_L3_PROTO_IDX_MASK     0x1F
  110 #define AL_ETH_RX_SRC_VLAN_CNT_MASK     3
  111 #define AL_ETH_RX_SRC_VLAN_CNT_SHIFT    5
  112 #define AL_ETH_RX_L4_PROTO_IDX_MASK     0x1F
  113 #define AL_ETH_RX_L4_PROTO_IDX_SHIFT    8
  114 
  115 #define AL_ETH_RX_L3_OFFSET_SHIFT       9
  116 #define AL_ETH_RX_L3_OFFSET_MASK        (0x7f << AL_ETH_RX_L3_OFFSET_SHIFT)
  117 #define AL_ETH_RX_HASH_SHIFT            16
  118 #define AL_ETH_RX_HASH_MASK             (0xffff         << AL_ETH_RX_HASH_SHIFT)
  119 
  120 #define ETH_MAC_GEN_LED_CFG_BLINK_TIMER_VAL 5
  121 #define ETH_MAC_GEN_LED_CFG_ACT_TIMER_VAL 7
  122 
  123 /* Tx VID Table*/
  124 #define AL_ETH_TX_VLAN_TABLE_UDMA_MASK          0xF
  125 #define AL_ETH_TX_VLAN_TABLE_FWD_TO_MAC         (1 << 4)
  126 
  127 /* tx gpd defines */
  128 #define AL_ETH_TX_GPD_L3_PROTO_MASK             0x1f
  129 #define AL_ETH_TX_GPD_L3_PROTO_SHIFT            0
  130 #define AL_ETH_TX_GPD_L4_PROTO_MASK             0x1f
  131 #define AL_ETH_TX_GPD_L4_PROTO_SHIFT            5
  132 #define AL_ETH_TX_GPD_TUNNEL_CTRL_MASK          0x7
  133 #define AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT         10
  134 #define AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK         0x3
  135 #define AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT        13
  136 #define AL_ETH_TX_GPD_CAM_DATA_2_SHIFT          32
  137 #define AL_ETH_TX_GPD_CAM_MASK_2_SHIFT          32
  138 #define AL_ETH_TX_GPD_CAM_CTRL_VALID_SHIFT      31
  139 
  140 /* tx gcp defines */
  141 #define AL_ETH_TX_GCP_POLY_SEL_MASK             0x1
  142 #define AL_ETH_TX_GCP_POLY_SEL_SHIFT            0
  143 #define AL_ETH_TX_GCP_CRC32_BIT_COMP_MASK       0x1
  144 #define AL_ETH_TX_GCP_CRC32_BIT_COMP_SHIFT      1
  145 #define AL_ETH_TX_GCP_CRC32_BIT_SWAP_MASK       0x1
  146 #define AL_ETH_TX_GCP_CRC32_BIT_SWAP_SHIFT      2
  147 #define AL_ETH_TX_GCP_CRC32_BYTE_SWAP_MASK      0x1
  148 #define AL_ETH_TX_GCP_CRC32_BYTE_SWAP_SHIFT     3
  149 #define AL_ETH_TX_GCP_DATA_BIT_SWAP_MASK        0x1
  150 #define AL_ETH_TX_GCP_DATA_BIT_SWAP_SHIFT       4
  151 #define AL_ETH_TX_GCP_DATA_BYTE_SWAP_MASK       0x1
  152 #define AL_ETH_TX_GCP_DATA_BYTE_SWAP_SHIFT      5
  153 #define AL_ETH_TX_GCP_TRAIL_SIZE_MASK           0xF
  154 #define AL_ETH_TX_GCP_TRAIL_SIZE_SHIFT          6
  155 #define AL_ETH_TX_GCP_HEAD_SIZE_MASK            0xFF
  156 #define AL_ETH_TX_GCP_HEAD_SIZE_SHIFT           16
  157 #define AL_ETH_TX_GCP_HEAD_CALC_MASK            0x1
  158 #define AL_ETH_TX_GCP_HEAD_CALC_SHIFT           24
  159 #define AL_ETH_TX_GCP_MASK_POLARITY_MASK        0x1
  160 #define AL_ETH_TX_GCP_MASK_POLARITY_SHIFT       25
  161 
  162 #define AL_ETH_TX_GCP_OPCODE_1_MASK             0x3F
  163 #define AL_ETH_TX_GCP_OPCODE_1_SHIFT            0
  164 #define AL_ETH_TX_GCP_OPCODE_2_MASK             0x3F
  165 #define AL_ETH_TX_GCP_OPCODE_2_SHIFT            6
  166 #define AL_ETH_TX_GCP_OPCODE_3_MASK             0x3F
  167 #define AL_ETH_TX_GCP_OPCODE_3_SHIFT            12
  168 #define AL_ETH_TX_GCP_OPSEL_1_MASK              0xF
  169 #define AL_ETH_TX_GCP_OPSEL_1_SHIFT             0
  170 #define AL_ETH_TX_GCP_OPSEL_2_MASK              0xF
  171 #define AL_ETH_TX_GCP_OPSEL_2_SHIFT             4
  172 #define AL_ETH_TX_GCP_OPSEL_3_MASK              0xF
  173 #define AL_ETH_TX_GCP_OPSEL_3_SHIFT             8
  174 #define AL_ETH_TX_GCP_OPSEL_4_MASK              0xF
  175 #define AL_ETH_TX_GCP_OPSEL_4_SHIFT             12
  176 
  177 /*  Tx crc_chksum_replace defines */
  178 #define L4_CHECKSUM_DIS_AND_L3_CHECKSUM_DIS     0x00
  179 #define L4_CHECKSUM_DIS_AND_L3_CHECKSUM_EN      0x20
  180 #define L4_CHECKSUM_EN_AND_L3_CHECKSUM_DIS      0x40
  181 #define L4_CHECKSUM_EN_AND_L3_CHECKSUM_EN       0x60
  182 
  183 /* rx gpd defines */
  184 #define AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK               0x1f
  185 #define AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT              (3 + 0)
  186 #define AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK               0x1f
  187 #define AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT              (3 + 8)
  188 #define AL_ETH_RX_GPD_INNER_L3_PROTO_MASK               0x1f
  189 #define AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT              (3 + 16)
  190 #define AL_ETH_RX_GPD_INNER_L4_PROTO_MASK               0x1f
  191 #define AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT              (3 + 24)
  192 #define AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK             0xFF
  193 #define AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT    32
  194 #define AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK             0xFF
  195 #define AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT    40
  196 #define AL_ETH_RX_GPD_L3_PRIORITY_MASK                  0xFF
  197 #define AL_ETH_RX_GPD_L3_PRIORITY_SHIFT                 48
  198 #define AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK              0xFF
  199 #define AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT             56
  200 #define AL_ETH_RX_GPD_CAM_DATA_2_SHIFT                  32
  201 #define AL_ETH_RX_GPD_CAM_MASK_2_SHIFT                  32
  202 #define AL_ETH_RX_GPD_CAM_CTRL_VALID_SHIFT              31
  203 
  204 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L3_PROTO_IDX_OFFSET    (106 + 5)
  205 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_PROTO_IDX_OFFSET    (106 + 10)
  206 #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_L3_PROTO_IDX_OFFSET    (0 + 5)
  207 #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_L4_PROTO_IDX_OFFSET    (0 + 10)
  208 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_PARSE_CTRL                     (106 + 4)
  209 #define AL_ETH_RX_GPD_PARSE_RESULT_INNER_PARSE_CTRL                     4
  210 #define AL_ETH_RX_GPD_PARSE_RESULT_L3_PRIORITY                  (106 + 13)
  211 #define AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_DST_PORT_LSB        (106 + 65)
  212 
  213 /* rx gcp defines */
  214 #define AL_ETH_RX_GCP_POLY_SEL_MASK             0x1
  215 #define AL_ETH_RX_GCP_POLY_SEL_SHIFT            0
  216 #define AL_ETH_RX_GCP_CRC32_BIT_COMP_MASK       0x1
  217 #define AL_ETH_RX_GCP_CRC32_BIT_COMP_SHIFT      1
  218 #define AL_ETH_RX_GCP_CRC32_BIT_SWAP_MASK       0x1
  219 #define AL_ETH_RX_GCP_CRC32_BIT_SWAP_SHIFT      2
  220 #define AL_ETH_RX_GCP_CRC32_BYTE_SWAP_MASK      0x1
  221 #define AL_ETH_RX_GCP_CRC32_BYTE_SWAP_SHIFT     3
  222 #define AL_ETH_RX_GCP_DATA_BIT_SWAP_MASK        0x1
  223 #define AL_ETH_RX_GCP_DATA_BIT_SWAP_SHIFT       4
  224 #define AL_ETH_RX_GCP_DATA_BYTE_SWAP_MASK       0x1
  225 #define AL_ETH_RX_GCP_DATA_BYTE_SWAP_SHIFT      5
  226 #define AL_ETH_RX_GCP_TRAIL_SIZE_MASK           0xF
  227 #define AL_ETH_RX_GCP_TRAIL_SIZE_SHIFT          6
  228 #define AL_ETH_RX_GCP_HEAD_SIZE_MASK            0xFF
  229 #define AL_ETH_RX_GCP_HEAD_SIZE_SHIFT           16
  230 #define AL_ETH_RX_GCP_HEAD_CALC_MASK            0x1
  231 #define AL_ETH_RX_GCP_HEAD_CALC_SHIFT           24
  232 #define AL_ETH_RX_GCP_MASK_POLARITY_MASK        0x1
  233 #define AL_ETH_RX_GCP_MASK_POLARITY_SHIFT       25
  234 
  235 #define AL_ETH_RX_GCP_OPCODE_1_MASK             0x3F
  236 #define AL_ETH_RX_GCP_OPCODE_1_SHIFT            0
  237 #define AL_ETH_RX_GCP_OPCODE_2_MASK             0x3F
  238 #define AL_ETH_RX_GCP_OPCODE_2_SHIFT            6
  239 #define AL_ETH_RX_GCP_OPCODE_3_MASK             0x3F
  240 #define AL_ETH_RX_GCP_OPCODE_3_SHIFT            12
  241 #define AL_ETH_RX_GCP_OPSEL_1_MASK              0xF
  242 #define AL_ETH_RX_GCP_OPSEL_1_SHIFT             0
  243 #define AL_ETH_RX_GCP_OPSEL_2_MASK              0xF
  244 #define AL_ETH_RX_GCP_OPSEL_2_SHIFT             4
  245 #define AL_ETH_RX_GCP_OPSEL_3_MASK              0xF
  246 #define AL_ETH_RX_GCP_OPSEL_3_SHIFT             8
  247 #define AL_ETH_RX_GCP_OPSEL_4_MASK              0xF
  248 #define AL_ETH_RX_GCP_OPSEL_4_SHIFT             12
  249 
  250 #define AL_ETH_MDIO_DELAY_PERIOD        1 /* micro seconds to wait when polling mdio status */
  251 #define AL_ETH_MDIO_DELAY_COUNT         150 /* number of times to poll */
  252 #define AL_ETH_S2M_UDMA_COMP_COAL_TIMEOUT       200 /* Rx descriptors coalescing timeout in SB clocks */
  253 
  254 #define AL_ETH_EPE_ENTRIES_NUM 26
  255 static struct al_eth_epe_p_reg_entry al_eth_epe_p_regs[AL_ETH_EPE_ENTRIES_NUM] = {
  256         { 0x0, 0x0, 0x0 },
  257         { 0x0, 0x0, 0x1 },
  258         { 0x0, 0x0, 0x2 },
  259         { 0x0, 0x0, 0x3 },
  260         { 0x18100, 0xFFFFF, 0x80000004 },
  261         { 0x188A8, 0xFFFFF, 0x80000005 },
  262         { 0x99100, 0xFFFFF, 0x80000006 },
  263         { 0x98100, 0xFFFFF, 0x80000007 },
  264         { 0x10800, 0x7FFFF, 0x80000008 },
  265         { 0x20000, 0x73FFF, 0x80000009 },
  266         { 0x20000, 0x70000, 0x8000000A },
  267         { 0x186DD, 0x7FFFF, 0x8000000B },
  268         { 0x30600, 0x7FF00, 0x8000000C },
  269         { 0x31100, 0x7FF00, 0x8000000D },
  270         { 0x32F00, 0x7FF00, 0x8000000E },
  271         { 0x32900, 0x7FF00, 0x8000000F },
  272         { 0x105DC, 0x7FFFF, 0x80010010 },
  273         { 0x188E5, 0x7FFFF, 0x80000011 },
  274         { 0x72000, 0x72000, 0x80000012 },
  275         { 0x70000, 0x72000, 0x80000013 },
  276         { 0x46558, 0x7FFFF, 0x80000001 },
  277         { 0x18906, 0x7FFFF, 0x80000015 },
  278         { 0x18915, 0x7FFFF, 0x80000016 },
  279         { 0x31B00, 0x7FF00, 0x80000017 },
  280         { 0x30400, 0x7FF00, 0x80000018 },
  281         { 0x0, 0x0, 0x8000001F }
  282 };
  283 
  284 
  285 static struct al_eth_epe_control_entry al_eth_epe_control_table[AL_ETH_EPE_ENTRIES_NUM] = {
  286         {{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
  287         {{ 0x280004C, 0x746000, 0xA46030, 0xE00000, 0x2, 0x400000 }},
  288         {{ 0x2800054, 0x746000, 0xA46030, 0x1600000, 0x2, 0x400000 }},
  289         {{ 0x280005C, 0x746000, 0xA46030, 0x1E00000, 0x2, 0x400000 }},
  290         {{ 0x2800042, 0xD42000, 0x0, 0x400000, 0x1010412, 0x400000 }},
  291         {{ 0x2800042, 0xD42000, 0x0, 0x400000, 0x1010412, 0x400000 }},
  292         {{ 0x2800042, 0xE42000, 0x0, 0x400000, 0x2020002, 0x400000 }},
  293         {{ 0x2800042, 0xE42000, 0x0, 0x400000, 0x2020002, 0x400000 }},
  294         {{ 0x280B046, 0x0, 0x6C1008, 0x0, 0x4, 0x406800 }},
  295         {{ 0x2800049, 0xF44060, 0x1744080, 0x14404, 0x6, 0x400011 }},
  296         {{ 0x2015049, 0xF44060, 0x1744080, 0x14404, 0x8080007, 0x400011 }},
  297         {{ 0x280B046, 0xF60040, 0x6C1004, 0x2800000, 0x6, 0x406811 }},
  298         {{ 0x2815042, 0x1F42000, 0x2042010, 0x1414460, 0x10100009, 0x40B800 }},
  299         {{ 0x2815042, 0x1F42000, 0x2042010, 0x800000, 0x10100009, 0x40B800 }},
  300         {{ 0x280B042, 0x0, 0x0, 0x430400, 0x4040009, 0x0 }},
  301         {{ 0x2815580, 0x0, 0x0, 0x0, 0x4040005, 0x0 }},
  302         {{ 0x280B000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
  303         {{ 0x2800040, 0x174E000, 0x0, 0x0, 0xE, 0x406800 }},
  304         {{ 0x280B000, 0x0, 0x0, 0x600000, 0x1, 0x406800 }},
  305         {{ 0x280B000, 0x0, 0x0, 0xE00000, 0x1, 0x406800 }},
  306         {{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }},
  307         {{ 0x280B046, 0x0, 0x0, 0x2800000, 0x7, 0x400000 }},
  308         {{ 0x280B046, 0xF60040, 0x6C1004, 0x2800000, 0x6, 0x406811 }},
  309         {{ 0x2815042, 0x1F43028, 0x2000000, 0xC00000, 0x10100009, 0x40B800 }},
  310         {{ 0x2815400, 0x0, 0x0, 0x0, 0x4040005, 0x0 }},
  311         {{ 0x2800000, 0x0, 0x0, 0x0, 0x1, 0x400000 }}
  312 };
  313 
  314 
  315 #define AL_ETH_IS_1G_MAC(mac_mode) (((mac_mode) == AL_ETH_MAC_MODE_RGMII) || ((mac_mode) == AL_ETH_MAC_MODE_SGMII))
  316 #define AL_ETH_IS_10G_MAC(mac_mode)     (((mac_mode) == AL_ETH_MAC_MODE_10GbE_Serial) ||        \
  317                                         ((mac_mode) == AL_ETH_MAC_MODE_10G_SGMII) ||            \
  318                                         ((mac_mode) == AL_ETH_MAC_MODE_SGMII_2_5G))
  319 #define AL_ETH_IS_25G_MAC(mac_mode) ((mac_mode) == AL_ETH_MAC_MODE_KR_LL_25G)
  320 
  321 static const char *al_eth_mac_mode_str(enum al_eth_mac_mode mode)
  322 {
  323         switch(mode) {
  324         case AL_ETH_MAC_MODE_RGMII:
  325                 return "RGMII";
  326         case AL_ETH_MAC_MODE_SGMII:
  327                 return "SGMII";
  328         case AL_ETH_MAC_MODE_SGMII_2_5G:
  329                 return "SGMII_2_5G";
  330         case AL_ETH_MAC_MODE_10GbE_Serial:
  331                 return "KR";
  332         case AL_ETH_MAC_MODE_KR_LL_25G:
  333                 return "KR_LL_25G";
  334         case AL_ETH_MAC_MODE_10G_SGMII:
  335                 return "10G_SGMII";
  336         case AL_ETH_MAC_MODE_XLG_LL_40G:
  337                 return "40G_LL";
  338         case AL_ETH_MAC_MODE_XLG_LL_50G:
  339                 return "50G_LL";
  340         case AL_ETH_MAC_MODE_XLG_LL_25G:
  341                 return "25G_LL";
  342         default:
  343                 return "N/A";
  344         }
  345 }
  346 
  347 /**
  348  * change and wait udma state
  349  *
  350  * @param dma the udma to change its state
  351  * @param new_state
  352  *
  353  * @return 0 on success. otherwise on failure.
  354  */
  355 static int al_udma_state_set_wait(struct al_udma *dma, enum al_udma_state new_state)
  356 {
  357         enum al_udma_state state;
  358         enum al_udma_state expected_state = new_state;
  359         int count = 1000;
  360         int rc;
  361 
  362         rc = al_udma_state_set(dma, new_state);
  363         if (rc != 0) {
  364                 al_warn("[%s] warn: failed to change state, error %d\n", dma->name, rc);
  365                 return rc;
  366         }
  367 
  368         if ((new_state == UDMA_NORMAL) || (new_state == UDMA_DISABLE))
  369                 expected_state = UDMA_IDLE;
  370 
  371         do {
  372                 state = al_udma_state_get(dma);
  373                 if (state == expected_state)
  374                         break;
  375                 al_udelay(1);
  376                 if (count-- == 0) {
  377                         al_warn("[%s] warn: dma state didn't change to %s\n",
  378                                  dma->name, al_udma_states_name[new_state]);
  379                         return -ETIMEDOUT;
  380                 }
  381         } while (1);
  382         return 0;
  383 }
  384 
  385 static void al_eth_epe_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
  386                 struct al_eth_epe_p_reg_entry *reg_entry,
  387                 struct al_eth_epe_control_entry *control_entry)
  388 {
  389         al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_data, reg_entry->data);
  390         al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_mask, reg_entry->mask);
  391         al_reg_write32(&adapter->ec_regs_base->epe_p[idx].comp_ctrl, reg_entry->ctrl);
  392 
  393         al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_data, reg_entry->data);
  394         al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_mask, reg_entry->mask);
  395         al_reg_write32(&adapter->ec_regs_base->msp_c[idx].p_comp_ctrl, reg_entry->ctrl);
  396 
  397         /*control table  0*/
  398         al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_addr, idx);
  399         al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_6,
  400                         control_entry->data[5]);
  401         al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_2,
  402                         control_entry->data[1]);
  403         al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_3,
  404                         control_entry->data[2]);
  405         al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_4,
  406                         control_entry->data[3]);
  407         al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_5,
  408                         control_entry->data[4]);
  409         al_reg_write32(&adapter->ec_regs_base->epe[0].act_table_data_1,
  410                         control_entry->data[0]);
  411 
  412         /*control table 1*/
  413         al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_addr, idx);
  414         al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_6,
  415                         control_entry->data[5]);
  416         al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_2,
  417                         control_entry->data[1]);
  418         al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_3,
  419                         control_entry->data[2]);
  420         al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_4,
  421                         control_entry->data[3]);
  422         al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_5,
  423                         control_entry->data[4]);
  424         al_reg_write32(&adapter->ec_regs_base->epe[1].act_table_data_1,
  425                         control_entry->data[0]);
  426 }
  427 
  428 static void al_eth_epe_init(struct al_hal_eth_adapter *adapter)
  429 {
  430         int idx;
  431 
  432         if (adapter->enable_rx_parser == 0) {
  433                 al_dbg("eth [%s]: disable rx parser\n", adapter->name);
  434 
  435                 al_reg_write32(&adapter->ec_regs_base->epe[0].res_def, 0x08000000);
  436                 al_reg_write32(&adapter->ec_regs_base->epe[0].res_in, 0x7);
  437 
  438                 al_reg_write32(&adapter->ec_regs_base->epe[1].res_def, 0x08000000);
  439                 al_reg_write32(&adapter->ec_regs_base->epe[1].res_in, 0x7);
  440 
  441                 return;
  442         }
  443         al_dbg("eth [%s]: enable rx parser\n", adapter->name);
  444         for (idx = 0; idx < AL_ETH_EPE_ENTRIES_NUM; idx++)
  445                 al_eth_epe_entry_set(adapter, idx, &al_eth_epe_p_regs[idx], &al_eth_epe_control_table[idx]);
  446 
  447         al_reg_write32(&adapter->ec_regs_base->epe[0].res_def, 0x08000080);
  448         al_reg_write32(&adapter->ec_regs_base->epe[0].res_in, 0x7);
  449 
  450         al_reg_write32(&adapter->ec_regs_base->epe[1].res_def, 0x08000080);
  451         al_reg_write32(&adapter->ec_regs_base->epe[1].res_in, 0);
  452 
  453         /* header length as function of 4 bits value, for GRE, when C bit is set, the header len should be increase by 4*/
  454         al_reg_write32(&adapter->ec_regs_base->epe_h[8].hdr_len, (4 << 16) | 4);
  455 
  456         /* select the outer information when writing the rx descriptor (l3 protocol index etc) */
  457         al_reg_write32(&adapter->ec_regs_base->rfw.meta, EC_RFW_META_L3_LEN_CALC);
  458 
  459         al_reg_write32(&adapter->ec_regs_base->rfw.checksum, EC_RFW_CHECKSUM_HDR_SEL);
  460 }
  461 
  462 /**
  463  * read 40G MAC registers (indirect access)
  464  *
  465  * @param adapter pointer to the private structure
  466  * @param reg_addr address in the an registers
  467  *
  468  * @return the register value
  469  */
  470 static uint32_t al_eth_40g_mac_reg_read(
  471                         struct al_hal_eth_adapter *adapter,
  472                         uint32_t reg_addr)
  473 {
  474         uint32_t val;
  475 
  476         /* indirect access */
  477         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, reg_addr);
  478         val = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data);
  479 
  480         al_dbg("[%s]: %s - reg %d. val 0x%x",
  481                adapter->name, __func__, reg_addr, val);
  482 
  483         return val;
  484 }
  485 
  486 /**
  487  * write 40G MAC registers (indirect access)
  488  *
  489  * @param adapter pointer to the private structure
  490  * @param reg_addr address in the an registers
  491  * @param reg_data value to write to the register
  492  *
  493  */
  494 static void al_eth_40g_mac_reg_write(
  495                         struct al_hal_eth_adapter *adapter,
  496                         uint32_t reg_addr,
  497                         uint32_t reg_data)
  498 {
  499         /* indirect access */
  500         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, reg_addr);
  501         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, reg_data);
  502 
  503         al_dbg("[%s]: %s - reg %d. val 0x%x",
  504                adapter->name, __func__, reg_addr, reg_data);
  505 }
  506 
  507 /**
  508  * read 40G PCS registers (indirect access)
  509  *
  510  * @param adapter pointer to the private structure
  511  * @param reg_addr address in the an registers
  512  *
  513  * @return the register value
  514  */
  515 static uint32_t al_eth_40g_pcs_reg_read(
  516                         struct al_hal_eth_adapter *adapter,
  517                         uint32_t reg_addr)
  518 {
  519         uint32_t val;
  520 
  521         /* indirect access */
  522         al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, reg_addr);
  523         val = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data);
  524 
  525         al_dbg("[%s]: %s - reg %d. val 0x%x",
  526                adapter->name, __func__, reg_addr, val);
  527 
  528         return val;
  529 }
  530 
  531 /**
  532  * write 40G PCS registers (indirect access)
  533  *
  534  * @param adapter pointer to the private structure
  535  * @param reg_addr address in the an registers
  536  * @param reg_data value to write to the register
  537  *
  538  */
  539 static void al_eth_40g_pcs_reg_write(
  540                         struct al_hal_eth_adapter *adapter,
  541                         uint32_t reg_addr,
  542                         uint32_t reg_data)
  543 {
  544         /* indirect access */
  545         al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, reg_addr);
  546         al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, reg_data);
  547 
  548         al_dbg("[%s]: %s - reg %d. val 0x%x",
  549                adapter->name, __func__, reg_addr, reg_data);
  550 }
  551 
  552 /*****************************API Functions  **********************************/
  553 /*adapter management */
  554 /**
  555  * initialize the ethernet adapter's DMA
  556  */
  557 int al_eth_adapter_init(struct al_hal_eth_adapter *adapter, struct al_eth_adapter_params *params)
  558 {
  559         struct al_udma_params udma_params;
  560         struct al_udma_m2s_pkt_len_conf conf;
  561         int i;
  562         uint32_t reg;
  563         int rc;
  564 
  565         al_dbg("eth [%s]: initialize controller's UDMA. id = %d\n", params->name, params->udma_id);
  566         al_dbg("eth [%s]: UDMA base regs: %p\n", params->name, params->udma_regs_base);
  567         al_dbg("eth [%s]: EC base regs: %p\n", params->name, params->ec_regs_base);
  568         al_dbg("eth [%s]: MAC base regs: %p\n", params->name, params->mac_regs_base);
  569         al_dbg("eth [%s]: enable_rx_parser: %x\n", params->name, params->enable_rx_parser);
  570 
  571         adapter->name = params->name;
  572         adapter->rev_id = params->rev_id;
  573         adapter->udma_id = params->udma_id;
  574         adapter->udma_regs_base = params->udma_regs_base;
  575         adapter->ec_regs_base = (struct al_ec_regs __iomem*)params->ec_regs_base;
  576         adapter->mac_regs_base = (struct al_eth_mac_regs __iomem*)params->mac_regs_base;
  577         adapter->unit_regs = (struct unit_regs __iomem *)params->udma_regs_base;
  578         adapter->enable_rx_parser = params->enable_rx_parser;
  579         adapter->serdes_lane = params->serdes_lane;
  580         adapter->ec_ints_base = (uint8_t __iomem *)adapter->ec_regs_base + 0x1c00;
  581         adapter->mac_ints_base = (struct interrupt_controller_ctrl __iomem *)
  582                         ((uint8_t __iomem *)adapter->mac_regs_base + 0x800);
  583 
  584         /* initialize Tx udma */
  585         udma_params.udma_regs_base = adapter->unit_regs;
  586         udma_params.type = UDMA_TX;
  587         udma_params.num_of_queues = AL_ETH_UDMA_TX_QUEUES;
  588         udma_params.name = "eth tx";
  589         rc = al_udma_init(&adapter->tx_udma, &udma_params);
  590 
  591         if (rc != 0) {
  592                 al_err("failed to initialize %s, error %d\n",
  593                          udma_params.name, rc);
  594                 return rc;
  595         }
  596         rc = al_udma_state_set_wait(&adapter->tx_udma, UDMA_NORMAL);
  597         if (rc != 0) {
  598                 al_err("[%s]: failed to change state, error %d\n",
  599                          udma_params.name, rc);
  600                 return rc;
  601         }
  602         /* initialize Rx udma */
  603         udma_params.udma_regs_base = adapter->unit_regs;
  604         udma_params.type = UDMA_RX;
  605         udma_params.num_of_queues = AL_ETH_UDMA_RX_QUEUES;
  606         udma_params.name = "eth rx";
  607         rc = al_udma_init(&adapter->rx_udma, &udma_params);
  608 
  609         if (rc != 0) {
  610                 al_err("failed to initialize %s, error %d\n",
  611                          udma_params.name, rc);
  612                 return rc;
  613         }
  614 
  615         rc = al_udma_state_set_wait(&adapter->rx_udma, UDMA_NORMAL);
  616         if (rc != 0) {
  617                 al_err("[%s]: failed to change state, error %d\n",
  618                          udma_params.name, rc);
  619                 return rc;
  620         }
  621         al_dbg("eth [%s]: controller's UDMA successfully initialized\n",
  622                  params->name);
  623 
  624         /* set max packet size to 1M (for TSO) */
  625         conf.encode_64k_as_zero = AL_TRUE;
  626         conf.max_pkt_size = 0xfffff;
  627         al_udma_m2s_packet_size_cfg_set(&adapter->tx_udma, &conf);
  628 
  629         /* set m2s (tx) max descriptors to max data buffers number and one for
  630          * meta descriptor
  631          */
  632         al_udma_m2s_max_descs_set(&adapter->tx_udma, AL_ETH_PKT_MAX_BUFS + 1);
  633 
  634         /* set s2m (rx) max descriptors to max data buffers */
  635         al_udma_s2m_max_descs_set(&adapter->rx_udma, AL_ETH_PKT_MAX_BUFS);
  636 
  637         /* set s2m burst lenght when writing completion descriptors to 64 bytes
  638          */
  639         al_udma_s2m_compl_desc_burst_config(&adapter->rx_udma, 64);
  640 
  641         /* if pointer to ec regs provided, then init the tx meta cache of this udma*/
  642         if (adapter->ec_regs_base != NULL) {
  643                 // INIT TX CACHE TABLE:
  644                 for (i = 0; i < 4; i++) {
  645                         al_reg_write32(&adapter->ec_regs_base->tso.cache_table_addr, i + (adapter->udma_id * 4));
  646                         al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_1, 0x00000000);
  647                         al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_2, 0x00000000);
  648                         al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_3, 0x00000000);
  649                         al_reg_write32(&adapter->ec_regs_base->tso.cache_table_data_4, 0x00000000);
  650                 }
  651         }
  652         // only udma 0 allowed to init ec
  653         if (adapter->udma_id != 0) {
  654                 return 0;
  655         }
  656         /* enable Ethernet controller: */
  657         /* enable internal machines*/
  658         al_reg_write32(&adapter->ec_regs_base->gen.en, 0xffffffff);
  659         al_reg_write32(&adapter->ec_regs_base->gen.fifo_en, 0xffffffff);
  660 
  661         if (adapter->rev_id > AL_ETH_REV_ID_0) {
  662                 /* enable A0 descriptor structure */
  663                 al_reg_write32_masked(&adapter->ec_regs_base->gen.en_ext,
  664                                       EC_GEN_EN_EXT_CACHE_WORD_SPLIT,
  665                                       EC_GEN_EN_EXT_CACHE_WORD_SPLIT);
  666 
  667                 /* use mss value in the descriptor */
  668                 al_reg_write32(&adapter->ec_regs_base->tso.cfg_add_0,
  669                                                 EC_TSO_CFG_ADD_0_MSS_SEL);
  670 
  671                 /* enable tunnel TSO */
  672                 al_reg_write32(&adapter->ec_regs_base->tso.cfg_tunnel,
  673                                                 (EC_TSO_CFG_TUNNEL_EN_TUNNEL_TSO |
  674                                                  EC_TSO_CFG_TUNNEL_EN_UDP_CHKSUM |
  675                                                  EC_TSO_CFG_TUNNEL_EN_UDP_LEN |
  676                                                  EC_TSO_CFG_TUNNEL_EN_IPV6_PLEN |
  677                                                  EC_TSO_CFG_TUNNEL_EN_IPV4_CHKSUM |
  678                                                  EC_TSO_CFG_TUNNEL_EN_IPV4_IDEN |
  679                                                  EC_TSO_CFG_TUNNEL_EN_IPV4_TLEN));
  680         }
  681 
  682         /* swap input byts from MAC RX */
  683         al_reg_write32(&adapter->ec_regs_base->mac.gen, 0x00000001);
  684         /* swap output bytes to MAC TX*/
  685         al_reg_write32(&adapter->ec_regs_base->tmi.tx_cfg, EC_TMI_TX_CFG_EN_FWD_TO_RX|EC_TMI_TX_CFG_SWAP_BYTES);
  686 
  687         /* TODO: check if we need this line*/
  688         al_reg_write32(&adapter->ec_regs_base->tfw_udma[0].fwd_dec, 0x000003fb);
  689 
  690         /* RFW configuration: default 0 */
  691         al_reg_write32(&adapter->ec_regs_base->rfw_default[0].opt_1, 0x00000001);
  692 
  693         /* VLAN table address*/
  694         al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_addr, 0x00000000);
  695         /* VLAN table data*/
  696         al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_data, 0x00000000);
  697         /* HASH config (select toeplitz and bits 7:0 of the thash result, enable
  698          * symmetric hash) */
  699         al_reg_write32(&adapter->ec_regs_base->rfw.thash_cfg_1,
  700                         EC_RFW_THASH_CFG_1_ENABLE_IP_SWAP |
  701                         EC_RFW_THASH_CFG_1_ENABLE_PORT_SWAP);
  702 
  703         al_eth_epe_init(adapter);
  704 
  705         /* disable TSO padding and use mac padding instead */
  706         reg = al_reg_read32(&adapter->ec_regs_base->tso.in_cfg);
  707         reg &= ~0x7F00; /*clear bits 14:8 */
  708         al_reg_write32(&adapter->ec_regs_base->tso.in_cfg, reg);
  709 
  710         return 0;
  711 }
  712 
  713 /*****************************API Functions  **********************************/
  714 /*adapter management */
  715 /**
  716  * enable the ec and mac interrupts
  717  */
  718 int al_eth_ec_mac_ints_config(struct al_hal_eth_adapter *adapter)
  719 {
  720 
  721         al_dbg("eth [%s]: enable ethernet and mac interrupts\n", adapter->name);
  722 
  723         // only udma 0 allowed to init ec
  724         if (adapter->udma_id != 0)
  725                 return -EPERM;
  726 
  727         /* enable mac ints */
  728         al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_A,
  729                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  730         al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_B,
  731                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  732         al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_C,
  733                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  734         al_iofic_config(adapter->ec_ints_base, AL_INT_GROUP_D,
  735                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  736 
  737         /* unmask MAC int */
  738         al_iofic_unmask(adapter->ec_ints_base, AL_INT_GROUP_A, 8);
  739 
  740         /* enable ec interrupts */
  741         al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_A,
  742                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  743         al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_B,
  744                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  745         al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_C,
  746                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  747         al_iofic_config(adapter->mac_ints_base, AL_INT_GROUP_D,
  748                 INT_CONTROL_GRP_SET_ON_POSEDGE | INT_CONTROL_GRP_CLEAR_ON_READ);
  749 
  750         /* eee active */
  751         al_iofic_unmask(adapter->mac_ints_base, AL_INT_GROUP_B, AL_BIT(14));
  752 
  753         al_iofic_unmask(adapter->unit_regs, AL_INT_GROUP_D, AL_BIT(11));
  754         return 0;
  755 }
  756 
  757 /**
  758  * ec and mac interrupt service routine
  759  * read and print asserted interrupts
  760  *
  761  * @param adapter pointer to the private structure
  762  *
  763  * @return 0 on success. otherwise on failure.
  764  */
  765 int al_eth_ec_mac_isr(struct al_hal_eth_adapter *adapter)
  766 {
  767         uint32_t cause;
  768         al_dbg("[%s]: ethernet interrupts handler\n", adapter->name);
  769 
  770         // only udma 0 allowed to init ec
  771         if (adapter->udma_id != 0)
  772                 return -EPERM;
  773 
  774         /* read ec cause */
  775         cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_A);
  776         al_dbg("[%s]: ethernet group A cause 0x%08x\n", adapter->name, cause);
  777         if (cause & 1)
  778         {
  779                 cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_A);
  780                 al_dbg("[%s]: mac group A cause 0x%08x\n", adapter->name, cause);
  781 
  782                 cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_B);
  783                 al_dbg("[%s]: mac group B cause 0x%08x\n", adapter->name, cause);
  784 
  785                 cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_C);
  786                 al_dbg("[%s]: mac group C cause 0x%08x\n", adapter->name, cause);
  787 
  788                 cause = al_iofic_read_cause(adapter->mac_ints_base, AL_INT_GROUP_D);
  789                 al_dbg("[%s]: mac group D cause 0x%08x\n", adapter->name, cause);
  790         }
  791         cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_B);
  792         al_dbg("[%s]: ethernet group B cause 0x%08x\n", adapter->name, cause);
  793         cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_C);
  794         al_dbg("[%s]: ethernet group C cause 0x%08x\n", adapter->name, cause);
  795         cause = al_iofic_read_cause(adapter->ec_ints_base, AL_INT_GROUP_D);
  796         al_dbg("[%s]: ethernet group D cause 0x%08x\n", adapter->name, cause);
  797 
  798         return 0;
  799 }
  800 
  801 /**
  802  * stop the DMA of the ethernet adapter
  803  */
  804 int al_eth_adapter_stop(struct al_hal_eth_adapter *adapter)
  805 {
  806         int rc;
  807 
  808         al_dbg("eth [%s]: stop controller's UDMA\n", adapter->name);
  809 
  810         /* disable Tx dma*/
  811         rc = al_udma_state_set_wait(&adapter->tx_udma, UDMA_DISABLE);
  812         if (rc != 0) {
  813                 al_warn("[%s] warn: failed to change state, error %d\n",
  814                          adapter->tx_udma.name, rc);
  815                 return rc;
  816         }
  817 
  818         al_dbg("eth [%s]: controller's TX UDMA stopped\n",
  819                  adapter->name);
  820         /* disable Rx dma*/
  821         rc = al_udma_state_set_wait(&adapter->rx_udma, UDMA_DISABLE);
  822         if (rc != 0) {
  823                 al_warn("[%s] warn: failed to change state, error %d\n",
  824                          adapter->rx_udma.name, rc);
  825                 return rc;
  826         }
  827 
  828         al_dbg("eth [%s]: controller's RX UDMA stopped\n",
  829                  adapter->name);
  830         return 0;
  831 }
  832 
  833 int al_eth_adapter_reset(struct al_hal_eth_adapter *adapter)
  834 {
  835         al_dbg("eth [%s]: reset controller's UDMA\n", adapter->name);
  836 
  837         return -EPERM;
  838 }
  839 
  840 /* Q management */
  841 /**
  842  * Configure and enable a queue ring
  843  */
  844 int al_eth_queue_config(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid,
  845                              struct al_udma_q_params *q_params)
  846 {
  847         struct al_udma *udma;
  848         int rc;
  849 
  850         al_dbg("eth [%s]: config UDMA %s queue %d\n", adapter->name,
  851                  type == UDMA_TX ? "Tx" : "Rx", qid);
  852 
  853         if (type == UDMA_TX) {
  854                 udma = &adapter->tx_udma;
  855         } else {
  856                 udma = &adapter->rx_udma;
  857         }
  858 
  859         q_params->adapter_rev_id = adapter->rev_id;
  860 
  861         rc = al_udma_q_init(udma, qid, q_params);
  862 
  863         if (rc)
  864                 return rc;
  865 
  866         if (type == UDMA_RX) {
  867                 rc = al_udma_s2m_q_compl_coal_config(&udma->udma_q[qid],
  868                                 AL_TRUE, AL_ETH_S2M_UDMA_COMP_COAL_TIMEOUT);
  869 
  870                 al_assert(q_params->cdesc_size <= 32);
  871 
  872                 if (q_params->cdesc_size > 16)
  873                         al_reg_write32_masked(&adapter->ec_regs_base->rfw.out_cfg,
  874                                         EC_RFW_OUT_CFG_META_CNT_MASK, 2);
  875         }
  876         return rc;
  877 }
  878 
  879 int al_eth_queue_enable(struct al_hal_eth_adapter *adapter __attribute__((__unused__)),
  880                         enum al_udma_type type __attribute__((__unused__)),
  881                         uint32_t qid __attribute__((__unused__)))
  882 {
  883         return -EPERM;
  884 }
  885 int al_eth_queue_disable(struct al_hal_eth_adapter *adapter __attribute__((__unused__)),
  886                          enum al_udma_type type __attribute__((__unused__)),
  887                          uint32_t qid __attribute__((__unused__)))
  888 {
  889         return -EPERM;
  890 }
  891 
  892 /* MAC layer */
  893 int al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter *adapter, uint32_t min_rx_len, uint32_t max_rx_len)
  894 {
  895         al_assert(max_rx_len <= AL_ETH_MAX_FRAME_LEN);
  896 
  897         /* EC minimum packet length [bytes] in RX */
  898         al_reg_write32(&adapter->ec_regs_base->mac.min_pkt, min_rx_len);
  899         /* EC maximum packet length [bytes] in RX */
  900         al_reg_write32(&adapter->ec_regs_base->mac.max_pkt, max_rx_len);
  901 
  902         if (adapter->rev_id > AL_ETH_REV_ID_2) {
  903                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, min_rx_len);
  904                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, max_rx_len);
  905         }
  906 
  907         /* configure the MAC's max rx length, add 16 bytes so the packet get
  908          * trimmed by the EC/Async_fifo rather by the MAC
  909         */
  910         if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
  911                 al_reg_write32(&adapter->mac_regs_base->mac_1g.frm_len, max_rx_len + 16);
  912         else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
  913                 /* 10G MAC control register  */
  914                 al_reg_write32(&adapter->mac_regs_base->mac_10g.frm_len, (max_rx_len + 16));
  915         else
  916                 al_eth_40g_mac_reg_write(adapter, ETH_MAC_GEN_V3_MAC_40G_FRM_LENGTH_ADDR, (max_rx_len + 16));
  917 
  918         return 0;
  919 }
  920 
  921 /* configure the mac media type. */
  922 int al_eth_mac_config(struct al_hal_eth_adapter *adapter, enum al_eth_mac_mode mode)
  923 {
  924         switch(mode) {
  925         case AL_ETH_MAC_MODE_RGMII:
  926                 al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
  927 
  928                 /* 1G MAC control register */
  929                 /* bit[0]  - TX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
  930                  * bit[1]  - RX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
  931                  * bit[3]  - ETH_SPEED - zeroed to enable 10/100 Mbps Ethernet
  932                  * bit[4]  - PROMIS_EN - asserted to enable MAC promiscuous mode
  933                  * bit[23] - CNTL_FRM-ENA - asserted to enable control frames
  934                  * bit[24] - NO_LGTH_CHECK - asserted to disable length checks, which is done in the controller
  935                  */
  936                 al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, 0x01800010);
  937 
  938                 /* RX_SECTION_EMPTY,  */
  939                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_empty, 0x00000000);
  940                 /* RX_SECTION_FULL,  */
  941                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_full, 0x0000000c); /* must be larger than almost empty */
  942                 /* RX_ALMOST_EMPTY,  */
  943                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_empty, 0x00000008);
  944                 /* RX_ALMOST_FULL,  */
  945                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_full, 0x00000008);
  946 
  947 
  948                 /* TX_SECTION_EMPTY,  */
  949                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_empty, 0x00000008); /* 8 ? */
  950                 /* TX_SECTION_FULL, 0 - store and forward, */
  951                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_full, 0x0000000c);
  952                 /* TX_ALMOST_EMPTY,  */
  953                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_empty, 0x00000008);
  954                 /* TX_ALMOST_FULL,  */
  955                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_full, 0x00000008);
  956 
  957                 /* XAUI MAC control register */
  958                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000000);
  959 
  960                 /* 1G MACSET 1G */
  961                 /* taking sel_1000/sel_10 inputs from rgmii PHY, and not from register.
  962                  * disabling magic_packets detection in mac */
  963                 al_reg_write32(&adapter->mac_regs_base->gen.mac_1g_cfg, 0x00000002);
  964                 /* RGMII set 1G */
  965                 al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
  966                 al_reg_write32(&adapter->mac_regs_base->gen.rgmii_sel, 0xF);
  967                 break;
  968         case AL_ETH_MAC_MODE_SGMII:
  969                 if (adapter->rev_id > AL_ETH_REV_ID_2) {
  970                         /* configure and enable the ASYNC FIFO between the MACs and the EC */
  971                         /* TX min packet size */
  972                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
  973                         /* TX max packet size */
  974                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
  975                         /* TX input bus configuration */
  976                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
  977                         /* TX output bus configuration */
  978                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
  979                         /* TX Valid/ready configuration */
  980                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000121);
  981                         /* RX min packet size */
  982                         /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
  983                         /* RX max packet size */
  984                         /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
  985                         /* RX input bus configuration */
  986                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
  987                         /* RX output bus configuration */
  988                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
  989                         /* RX Valid/ready configuration */
  990                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000212);
  991                         /* V3 additional MAC selection */
  992                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
  993                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000001);
  994                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
  995                         al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
  996                         /* ASYNC FIFO ENABLE */
  997                         al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
  998                         /* Timestamp_configuration */
  999                         al_reg_write32(&adapter->mac_regs_base->gen_v3.spare,
 1000                                         ETH_MAC_GEN_V3_SPARE_CHICKEN_DISABLE_TIMESTAMP_STRETCH);
 1001                 }
 1002 
 1003                 al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40053210);
 1004 
 1005                 /* 1G MAC control register */
 1006                 /* bit[0]  - TX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
 1007                  * bit[1]  - RX_ENA - zeroed by default. Should be asserted by al_eth_mac_start
 1008                  * bit[3]  - ETH_SPEED - zeroed to enable 10/100 Mbps Ethernet
 1009                  * bit[4]  - PROMIS_EN - asserted to enable MAC promiscuous mode
 1010                  * bit[23] - CNTL_FRM-ENA - asserted to enable control frames
 1011                  * bit[24] - NO_LGTH_CHECK - asserted to disable length checks, which is done in the controller
 1012                  */
 1013                 al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, 0x01800010);
 1014 
 1015                 /* RX_SECTION_EMPTY,  */
 1016                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_empty, 0x00000000);
 1017                 /* RX_SECTION_FULL,  */
 1018                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_section_full, 0x0000000c); /* must be larger than almost empty */
 1019                 /* RX_ALMOST_EMPTY,  */
 1020                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_empty, 0x00000008);
 1021                 /* RX_ALMOST_FULL,  */
 1022                 al_reg_write32(&adapter->mac_regs_base->mac_1g.rx_almost_full, 0x00000008);
 1023 
 1024 
 1025                 /* TX_SECTION_EMPTY,  */
 1026                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_empty, 0x00000008); /* 8 ? */
 1027                 /* TX_SECTION_FULL, 0 - store and forward, */
 1028                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_section_full, 0x0000000c);
 1029                 /* TX_ALMOST_EMPTY,  */
 1030                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_empty, 0x00000008);
 1031                 /* TX_ALMOST_FULL,  */
 1032                 al_reg_write32(&adapter->mac_regs_base->mac_1g.tx_almost_full, 0x00000008);
 1033 
 1034                 /* XAUI MAC control register */
 1035                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x000000c0);
 1036 
 1037                 /* 1G MACSET 1G */
 1038                 /* taking sel_1000/sel_10 inputs from rgmii_converter, and not from register.
 1039                  * disabling magic_packets detection in mac */
 1040                 al_reg_write32(&adapter->mac_regs_base->gen.mac_1g_cfg, 0x00000002);
 1041                 /* SerDes configuration */
 1042                 al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
 1043                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
 1044                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
 1045 
 1046                 // FAST AN -- Testing only
 1047 #ifdef AL_HAL_ETH_FAST_AN
 1048                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000012);
 1049                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x00000040);
 1050                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000013);
 1051                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x00000000);
 1052 #endif
 1053 
 1054                 /* Setting PCS i/f mode to SGMII (instead of default 1000Base-X) */
 1055                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000014);
 1056                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x0000000b);
 1057                 /* setting dev_ability to have speed of 1000Mb, [11:10] = 2'b10 */
 1058                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 0x00000004);
 1059                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data, 0x000009A0);
 1060                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1061                                       ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1062                                       ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1063                 break;
 1064 
 1065         case AL_ETH_MAC_MODE_SGMII_2_5G:
 1066                 if (adapter->rev_id > AL_ETH_REV_ID_2) {
 1067                         /* configure and enable the ASYNC FIFO between the MACs and the EC */
 1068                         /* TX min packet size */
 1069                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
 1070                         /* TX max packet size */
 1071                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
 1072                         /* TX input bus configuration */
 1073                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
 1074                         /* TX output bus configuration */
 1075                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
 1076                         /* TX Valid/ready configuration */
 1077                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
 1078                         /* RX input bus configuration */
 1079                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
 1080                         /* RX output bus configuration */
 1081                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
 1082                         /* RX Valid/ready configuration */
 1083                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
 1084                         /* V3 additional MAC selection */
 1085                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
 1086                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
 1087                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
 1088                         al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000050);
 1089                         /* ASYNC FIFO ENABLE */
 1090                         al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
 1091                 }
 1092 
 1093                 /* MAC register file */
 1094                 al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022830);
 1095                 /* XAUI MAC control register */
 1096                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000001);
 1097                 al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, 0x00000028);
 1098                 al_reg_write32(&adapter->mac_regs_base->mac_10g.control, 0x00001140);
 1099                 /* RXAUI MAC control register */
 1100                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
 1101 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
 1102                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
 1103 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
 1104                 al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
 1105                                       ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
 1106                 al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
 1107                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
 1108                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
 1109 
 1110                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1111                                       ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1112                                       ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1113                 break;
 1114 
 1115         case AL_ETH_MAC_MODE_10GbE_Serial:
 1116                 if (adapter->rev_id > AL_ETH_REV_ID_2) {
 1117                         /* configure and enable the ASYNC FIFO between the MACs and the EC */
 1118                         /* TX min packet size */
 1119                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
 1120                         /* TX max packet size */
 1121                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
 1122                         /* TX input bus configuration */
 1123                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
 1124                         /* TX output bus configuration */
 1125                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
 1126                         /* TX Valid/ready configuration */
 1127                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
 1128                         /* RX min packet size */
 1129                         /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
 1130                         /* RX max packet size */
 1131                         /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
 1132                         /* RX input bus configuration */
 1133                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
 1134                         /* RX output bus configuration */
 1135                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
 1136                         /* RX Valid/ready configuration */
 1137                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
 1138                         /* V3 additional MAC selection */
 1139                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
 1140                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
 1141                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
 1142                         al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000050);
 1143                         /* ASYNC FIFO ENABLE */
 1144                         al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
 1145                 }
 1146 
 1147                 /* MAC register file */
 1148                 al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
 1149                 /* XAUI MAC control register */
 1150                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
 1151                 /* RXAUI MAC control register */
 1152                 al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
 1153                 al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
 1154                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
 1155 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
 1156                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
 1157 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
 1158                 al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
 1159                                         ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910);
 1160                 al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
 1161                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
 1162                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
 1163 
 1164                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1165                                       ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1166                                       ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1167                 break;
 1168 
 1169         case AL_ETH_MAC_MODE_KR_LL_25G:
 1170                         /* select 25G SERDES lane 0 and lane 1 */
 1171                 al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0002110f);
 1172 
 1173                 if (adapter->rev_id > AL_ETH_REV_ID_2) {
 1174                         /* configure and enable the ASYNC FIFO between the MACs and the EC */
 1175                         /* TX min packet size */
 1176                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
 1177                         /* TX max packet size */
 1178                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
 1179                         /* TX input bus configuration */
 1180                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
 1181                         /* TX output bus configuration */
 1182                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00030020);
 1183                         /* TX Valid/ready configuration */
 1184                         al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
 1185                         /* RX min packet size */
 1186                         /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
 1187                         /* RX max packet size */
 1188                         /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
 1189                         /* RX input bus configuration */
 1190                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00030020);
 1191                         /* RX output bus configuration */
 1192                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
 1193                         /* RX Valid/ready configuration */
 1194                         al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000012);
 1195                         /* V3 additional MAC selection */
 1196                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000000);
 1197                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
 1198                         al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
 1199                         al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x000000a0);
 1200                         /* ASYNC FIFO ENABLE */
 1201                         al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
 1202                 }
 1203 
 1204                 /* MAC register file */
 1205                 al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
 1206                 /* XAUI MAC control register */
 1207                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
 1208                 /* RXAUI MAC control register */
 1209                 al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
 1210                 al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
 1211                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
 1212 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
 1213                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
 1214 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
 1215 
 1216                 if (adapter->serdes_lane == 0)
 1217                         al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
 1218                                         ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910);
 1219                 else
 1220                         al_reg_write32(&adapter->mac_regs_base->gen.mux_sel, 0x00077910);
 1221 
 1222                 if (adapter->serdes_lane == 0)
 1223                         al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
 1224                 else
 1225                         al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10000101);
 1226 
 1227                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0);
 1228                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
 1229 
 1230                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1231                                       ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1232                                       ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1233 
 1234                 if (adapter->serdes_lane == 1)
 1235                         al_reg_write32(&adapter->mac_regs_base->gen.los_sel, 0x101);
 1236 
 1237 
 1238                 break;
 1239 
 1240         case AL_ETH_MAC_MODE_10G_SGMII:
 1241                 /* MAC register file */
 1242                 al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810);
 1243 
 1244                 /* XAUI MAC control register */
 1245                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000001);
 1246 
 1247                 al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, 0x0000002b);
 1248                 al_reg_write32(&adapter->mac_regs_base->mac_10g.control, 0x00009140);
 1249                 // FAST AN -- Testing only
 1250 #ifdef AL_HAL_ETH_FAST_AN
 1251                 al_reg_write32(&adapter->mac_regs_base->mac_10g.link_timer_lo, 0x00000040);
 1252                 al_reg_write32(&adapter->mac_regs_base->mac_10g.link_timer_hi, 0x00000000);
 1253 #endif
 1254 
 1255                 /* RXAUI MAC control register */
 1256                 al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
 1257                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
 1258 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
 1259                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
 1260 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
 1261                 al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
 1262                                         ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00063910);
 1263                 al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x40003210);
 1264                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401);
 1265 
 1266                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1267                                       ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1268                                       ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1269                 break;
 1270 
 1271         case AL_ETH_MAC_MODE_XLG_LL_40G:
 1272                 /* configure and enable the ASYNC FIFO between the MACs and the EC */
 1273                 /* TX min packet size */
 1274                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
 1275                 /* TX max packet size */
 1276                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
 1277                 /* TX input bus configuration */
 1278                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
 1279                 /* TX output bus configuration */
 1280                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
 1281                 /* TX Valid/ready configuration */
 1282                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
 1283                 /* RX min packet size */
 1284                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
 1285                 /* RX max packet size */
 1286                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
 1287                 /* RX input bus configuration */
 1288                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
 1289                 /* RX output bus configuration */
 1290                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
 1291                 /* RX Valid/ready configuration */
 1292                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
 1293                 /* V3 additional MAC selection */
 1294                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
 1295                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
 1296                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
 1297                 al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
 1298                 /* ASYNC FIFO ENABLE */
 1299                 al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
 1300 
 1301                 /* cmd_cfg */
 1302                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
 1303                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
 1304                 /* speed_ability //Read-Only */
 1305                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
 1306                 /* 40G capable */
 1307                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
 1308 
 1309 #ifdef AL_HAL_ETH_FAST_AN
 1310                 al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
 1311                 al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
 1312                 al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
 1313 
 1314 #endif
 1315 
 1316                 /* XAUI MAC control register */
 1317                 al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
 1318                                         ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
 1319                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
 1320 
 1321                 /* MAC register file */
 1322 /*              al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810); */
 1323                 /* XAUI MAC control register */
 1324                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
 1325                 /* RXAUI MAC control register */
 1326                 al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
 1327                 al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
 1328                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
 1329 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
 1330                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
 1331 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
 1332 /*              al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910); *//* XLG_LL_40G change */
 1333                 al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
 1334 /*              al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0); *//* XLG_LL_40G change */
 1335 /*              al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401); *//* XLG_LL_40G change */
 1336 
 1337                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1338                                       ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1339                                       ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1340                 break;
 1341 
 1342         case AL_ETH_MAC_MODE_XLG_LL_25G:
 1343                 /* xgmii_mode: 0=xlgmii, 1=xgmii */
 1344                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x0080);
 1345                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x00000001);
 1346 
 1347                 /* configure and enable the ASYNC FIFO between the MACs and the EC */
 1348                 /* TX min packet size */
 1349                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
 1350                 /* TX max packet size */
 1351                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
 1352                 /* TX input bus configuration */
 1353                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
 1354                 /* TX output bus configuration */
 1355                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
 1356                 /* TX Valid/ready configuration */
 1357                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
 1358                 /* RX min packet size */
 1359                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
 1360                 /* RX max packet size */
 1361                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
 1362                 /* RX input bus configuration */
 1363                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
 1364                 /* RX output bus configuration */
 1365                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
 1366                 /* RX Valid/ready configuration */
 1367                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
 1368                 /* V3 additional MAC selection */
 1369                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
 1370                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
 1371                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
 1372                 al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
 1373                 /* ASYNC FIFO ENABLE */
 1374                 al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
 1375 
 1376                 /* cmd_cfg */
 1377                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
 1378                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
 1379                 /* speed_ability //Read-Only */
 1380                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
 1381                 /* 40G capable */
 1382                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
 1383 
 1384                 /* select the 25G serdes for lanes 0/1 */
 1385                 al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0002110f);
 1386                 /* configure the PCS to work with 2 lanes */
 1387                 /* configure which two of the 4 PCS Lanes (VL) are combined to one RXLAUI lane */
 1388                 /* use VL 0-2 for RXLAUI lane 0, use VL 1-3 for RXLAUI lane 1 */
 1389                 al_eth_40g_pcs_reg_write(adapter, 0x00010008, 0x0d80);
 1390                 /* configure the PCS to work 32 bit interface */
 1391                 al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_cfg, 0x00440000);
 1392 
 1393                 /* disable MLD and move to clause 49 PCS: */
 1394                 al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0xE);
 1395                 al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0);
 1396 
 1397 #ifdef AL_HAL_ETH_FAST_AN
 1398                 al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
 1399                 al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
 1400                 al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
 1401 #endif
 1402 
 1403                 /* XAUI MAC control register */
 1404                 if (adapter->serdes_lane == 0)
 1405                         al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel,
 1406                                               ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
 1407                 else
 1408                         al_reg_write32(&adapter->mac_regs_base->gen.mux_sel, 0x06803950);
 1409 
 1410                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
 1411 
 1412                 /* XAUI MAC control register */
 1413                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
 1414                 /* RXAUI MAC control register */
 1415                 al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
 1416                 al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
 1417                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
 1418                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
 1419                 if (adapter->serdes_lane == 0)
 1420                         al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
 1421                 else
 1422                         al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10000101);
 1423 
 1424                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1425                                         ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1426                                         ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1427 
 1428                 if (adapter->serdes_lane == 1)
 1429                         al_reg_write32(&adapter->mac_regs_base->gen.los_sel, 0x101);
 1430 
 1431                 break;
 1432 
 1433         case AL_ETH_MAC_MODE_XLG_LL_50G:
 1434 
 1435                 /* configure and enable the ASYNC FIFO between the MACs and the EC */
 1436                 /* TX min packet size */
 1437                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_1, 0x00000010);
 1438                 /* TX max packet size */
 1439                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_2, 0x00002800);
 1440                 /* TX input bus configuration */
 1441                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_3, 0x00000080);
 1442                 /* TX output bus configuration */
 1443                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_4, 0x00010040);
 1444                 /* TX Valid/ready configuration */
 1445                 al_reg_write32(&adapter->mac_regs_base->gen_v3.tx_afifo_cfg_5, 0x00000023);
 1446                 /* RX min packet size */
 1447                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_1, 0x00000040); */
 1448                 /* RX max packet size */
 1449                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_2, 0x00002800); */
 1450                 /* RX input bus configuration */
 1451                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_3, 0x00010040);
 1452                 /* RX output bus configuration */
 1453                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_4, 0x00000080);
 1454                 /* RX Valid/ready configuration */
 1455                 al_reg_write32(&adapter->mac_regs_base->gen_v3.rx_afifo_cfg_5, 0x00000112);
 1456                 /* V3 additional MAC selection */
 1457                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_sel, 0x00000010);
 1458                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_cfg, 0x00000000);
 1459                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_10g_ll_ctrl, 0x00000000);
 1460                 al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg, 0x00000000);
 1461                 /* ASYNC FIFO ENABLE */
 1462                 al_reg_write32(&adapter->mac_regs_base->gen_v3.afifo_ctrl, 0x00003333);
 1463 
 1464                 /* cmd_cfg */
 1465                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_addr, 0x00000008);
 1466                 al_reg_write32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_data, 0x01022810);
 1467                 /* speed_ability //Read-Only */
 1468                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_addr, 0x00000008); */
 1469                 /* 40G capable */
 1470                 /* al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_data, 0x00000002); */
 1471 
 1472                 /* select the 25G serdes for lanes 0/1 */
 1473                 al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, 0x0382110F);
 1474                 /* configure the PCS to work with 2 lanes */
 1475                 /* configure which two of the 4 PCS Lanes (VL) are combined to one RXLAUI lane */
 1476                 /* use VL 0-2 for RXLAUI lane 0, use VL 1-3 for RXLAUI lane 1 */
 1477                 al_eth_40g_pcs_reg_write(adapter, 0x00010008, 0x0d81);
 1478                 /* configure the PCS to work 32 bit interface */
 1479                 al_reg_write32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_cfg, 0x00440000);
 1480 
 1481 
 1482 #ifdef AL_HAL_ETH_FAST_AN
 1483                 al_eth_40g_pcs_reg_write(adapter, 0x00010004, 1023);
 1484                 al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0xA04c);
 1485                 al_eth_40g_pcs_reg_write(adapter, 0x00000000, 0x204c);
 1486 #endif
 1487 
 1488                 /* XAUI MAC control register */
 1489                 al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x06883910);
 1490                 al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x0000040f);
 1491 
 1492                 /* MAC register file */
 1493 /*              al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, 0x01022810); */
 1494                 /* XAUI MAC control register */
 1495                 al_reg_write32(&adapter->mac_regs_base->gen.cfg, 0x00000005);
 1496                 /* RXAUI MAC control register */
 1497                 al_reg_write32(&adapter->mac_regs_base->gen.rxaui_cfg, 0x00000007);
 1498                 al_reg_write32(&adapter->mac_regs_base->gen.sd_cfg, 0x000001F1);
 1499                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_32_64, 0x00000401);
 1500 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_out, 0x00000401); */
 1501                 al_reg_write32(&adapter->mac_regs_base->gen.xgmii_dfifo_64_32, 0x00000401);
 1502 /*              al_reg_write32(&adapter->mac_regs_base->gen.mac_res_1_in, 0x00000401); */
 1503 /*              al_reg_write32_masked(&adapter->mac_regs_base->gen.mux_sel, ~ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, 0x00073910); *//* XLG_LL_40G change */
 1504                 al_reg_write32(&adapter->mac_regs_base->gen.clk_cfg, 0x10003210);
 1505 /*              al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x000004f0); *//* XLG_LL_40G change */
 1506 /*              al_reg_write32(&adapter->mac_regs_base->gen.sd_fifo_ctrl, 0x00000401); *//* XLG_LL_40G change */
 1507 
 1508                 al_reg_write32_masked(&adapter->mac_regs_base->gen.led_cfg,
 1509                                       ETH_MAC_GEN_LED_CFG_SEL_MASK,
 1510                                       ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG);
 1511                 break;
 1512 
 1513 
 1514         default:
 1515                 al_err("Eth: unsupported MAC mode %d", mode);
 1516                 return -EPERM;
 1517         }
 1518         adapter->mac_mode = mode;
 1519         al_info("configured MAC to %s mode:\n", al_eth_mac_mode_str(mode));
 1520 
 1521         return 0;
 1522 }
 1523 
 1524 /* start the mac */
 1525 int al_eth_mac_start(struct al_hal_eth_adapter *adapter)
 1526 {
 1527         if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
 1528                 /* 1G MAC control register */
 1529                 al_reg_write32_masked(&adapter->mac_regs_base->mac_1g.cmd_cfg,
 1530                                 ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA,
 1531                                 ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA);
 1532         } else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
 1533                 /* 10G MAC control register  */
 1534                 al_reg_write32_masked(&adapter->mac_regs_base->mac_10g.cmd_cfg,
 1535                                 ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA,
 1536                                 ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA);
 1537         } else {
 1538                 uint32_t cmd_cfg;
 1539 
 1540                 cmd_cfg = al_eth_40g_mac_reg_read(adapter,
 1541                                 ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
 1542 
 1543                 cmd_cfg |= (ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_TX_ENA |
 1544                             ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_RX_ENA);
 1545 
 1546                 al_eth_40g_mac_reg_write(adapter,
 1547                                 ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR,
 1548                                 cmd_cfg);
 1549         }
 1550 
 1551         return 0;
 1552 }
 1553 
 1554 /* stop the mac */
 1555 int al_eth_mac_stop(struct al_hal_eth_adapter *adapter)
 1556 {
 1557         if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
 1558                 /* 1G MAC control register */
 1559                 al_reg_write32_masked(&adapter->mac_regs_base->mac_1g.cmd_cfg,
 1560                                 ETH_1G_MAC_CMD_CFG_TX_ENA | ETH_1G_MAC_CMD_CFG_RX_ENA,
 1561                                 0);
 1562         else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
 1563                 /* 10G MAC control register  */
 1564                 al_reg_write32_masked(&adapter->mac_regs_base->mac_10g.cmd_cfg,
 1565                                 ETH_10G_MAC_CMD_CFG_TX_ENA | ETH_10G_MAC_CMD_CFG_RX_ENA,
 1566                                 0);
 1567         else {
 1568                 uint32_t cmd_cfg;
 1569 
 1570                 cmd_cfg = al_eth_40g_mac_reg_read(adapter,
 1571                                 ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
 1572 
 1573                 cmd_cfg &= ~(ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_TX_ENA |
 1574                             ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_RX_ENA);
 1575 
 1576                 al_eth_40g_mac_reg_write(adapter,
 1577                                 ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR,
 1578                                 cmd_cfg);
 1579         }
 1580 
 1581         return 0;
 1582 }
 1583 
 1584 void al_eth_gearbox_reset(struct al_hal_eth_adapter *adapter, al_bool tx_reset, al_bool rx_reset)
 1585 {
 1586         uint32_t reg, orig_val;
 1587 
 1588         /* Gearbox is exist only from revision 3 */
 1589         al_assert(adapter->rev_id > AL_ETH_REV_ID_2);
 1590 
 1591         orig_val = al_reg_read32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl);
 1592         reg = orig_val;
 1593 
 1594         if (tx_reset) {
 1595                 reg |= (ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_0_TX_25_GS_SW_RESET |
 1596                         ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_1_TX_25_GS_SW_RESET);
 1597         }
 1598 
 1599         if (rx_reset) {
 1600                 reg |= (ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_0_RX_25_GS_SW_RESET |
 1601                         ETH_MAC_GEN_V3_EXT_SERDES_CTRL_LANE_1_RX_25_GS_SW_RESET);
 1602         }
 1603 
 1604         al_dbg("%s: perform gearbox reset (Tx %d, Rx %d) \n", __func__, tx_reset, rx_reset);
 1605         al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, reg);
 1606 
 1607         al_udelay(10);
 1608 
 1609         al_reg_write32(&adapter->mac_regs_base->gen_v3.ext_serdes_ctrl, orig_val);
 1610 }
 1611 
 1612 int al_eth_fec_enable(struct al_hal_eth_adapter *adapter, al_bool enable)
 1613 {
 1614         if (adapter->rev_id <= AL_ETH_REV_ID_2)
 1615                 return -1;
 1616 
 1617         if (enable)
 1618                 al_reg_write32_masked(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg,
 1619                                         (ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
 1620                                          ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX),
 1621                                         (ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
 1622                                          ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX));
 1623         else
 1624                 al_reg_write32_masked(&adapter->mac_regs_base->gen_v3.pcs_10g_ll_cfg,
 1625                                         (ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_RX |
 1626                                          ETH_MAC_GEN_V3_PCS_10G_LL_CFG_FEC_EN_TX),
 1627                                         0);
 1628         return 0;
 1629 }
 1630 
 1631 int al_eth_fec_stats_get(struct al_hal_eth_adapter *adapter,
 1632                         uint32_t *corrected, uint32_t *uncorrectable)
 1633 {
 1634         if (adapter->rev_id <= AL_ETH_REV_ID_2)
 1635                 return -1;
 1636 
 1637         *corrected = al_reg_read32(&adapter->mac_regs_base->stat.v3_pcs_10g_ll_cerr);
 1638         *uncorrectable = al_reg_read32(&adapter->mac_regs_base->stat.v3_pcs_10g_ll_ncerr);
 1639 
 1640         return 0;
 1641 }
 1642 
 1643 
 1644 int al_eth_capabilities_get(struct al_hal_eth_adapter *adapter, struct al_eth_capabilities *caps)
 1645 {
 1646         al_assert(caps);
 1647 
 1648         caps->speed_10_HD = AL_FALSE;
 1649         caps->speed_10_FD = AL_FALSE;
 1650         caps->speed_100_HD = AL_FALSE;
 1651         caps->speed_100_FD = AL_FALSE;
 1652         caps->speed_1000_HD = AL_FALSE;
 1653         caps->speed_1000_FD = AL_FALSE;
 1654         caps->speed_10000_HD = AL_FALSE;
 1655         caps->speed_10000_FD = AL_FALSE;
 1656         caps->pfc = AL_FALSE;
 1657         caps->eee = AL_FALSE;
 1658 
 1659         switch (adapter->mac_mode) {
 1660                 case AL_ETH_MAC_MODE_RGMII:
 1661                 case AL_ETH_MAC_MODE_SGMII:
 1662                         caps->speed_10_HD = AL_TRUE;
 1663                         caps->speed_10_FD = AL_TRUE;
 1664                         caps->speed_100_HD = AL_TRUE;
 1665                         caps->speed_100_FD = AL_TRUE;
 1666                         caps->speed_1000_FD = AL_TRUE;
 1667                         caps->eee = AL_TRUE;
 1668                         break;
 1669                 case AL_ETH_MAC_MODE_10GbE_Serial:
 1670                         caps->speed_10000_FD = AL_TRUE;
 1671                         caps->pfc = AL_TRUE;
 1672                         break;
 1673                 default:
 1674                 al_err("Eth: unsupported MAC mode %d", adapter->mac_mode);
 1675                 return -EPERM;
 1676         }
 1677         return 0;
 1678 }
 1679 
 1680 static void al_eth_mac_link_config_1g_mac(
 1681                                 struct al_hal_eth_adapter *adapter,
 1682                                 al_bool force_1000_base_x,
 1683                                 al_bool an_enable,
 1684                                 uint32_t speed,
 1685                                 al_bool full_duplex)
 1686 {
 1687         uint32_t mac_ctrl;
 1688         uint32_t sgmii_ctrl = 0;
 1689         uint32_t sgmii_if_mode = 0;
 1690         uint32_t rgmii_ctrl = 0;
 1691 
 1692         mac_ctrl = al_reg_read32(&adapter->mac_regs_base->mac_1g.cmd_cfg);
 1693 
 1694         if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
 1695                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
 1696                                ETH_MAC_SGMII_REG_ADDR_CTRL_REG);
 1697                 sgmii_ctrl = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
 1698                 /*
 1699                  * in case bit 0 is off in sgmii_if_mode register all the other
 1700                  * bits are ignored.
 1701                  */
 1702                 if (force_1000_base_x == AL_FALSE)
 1703                         sgmii_if_mode = ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_EN;
 1704 
 1705                 if (an_enable == AL_TRUE) {
 1706                         sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_AN;
 1707                         sgmii_ctrl |= ETH_MAC_SGMII_REG_DATA_CTRL_AN_ENABLE;
 1708                 } else {
 1709                         sgmii_ctrl &= ~(ETH_MAC_SGMII_REG_DATA_CTRL_AN_ENABLE);
 1710                 }
 1711         }
 1712 
 1713         if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
 1714                 /*
 1715                  * Use the speed provided by the MAC instead of the PHY
 1716                  */
 1717                 rgmii_ctrl = al_reg_read32(&adapter->mac_regs_base->gen.rgmii_cfg);
 1718 
 1719                 AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_ENA_AUTO);
 1720                 AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_SET_1000_SEL);
 1721                 AL_REG_MASK_CLEAR(rgmii_ctrl, ETH_MAC_GEN_RGMII_CFG_SET_10_SEL);
 1722 
 1723                 al_reg_write32(&adapter->mac_regs_base->gen.rgmii_cfg, rgmii_ctrl);
 1724         }
 1725 
 1726         if (full_duplex == AL_TRUE) {
 1727                 AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_HD_EN);
 1728         } else {
 1729                 AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_HD_EN);
 1730                 sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_DUPLEX;
 1731         }
 1732 
 1733         if (speed == 1000) {
 1734                 AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_1G_SPD);
 1735                 sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_SPEED_1000;
 1736         } else {
 1737                 AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_1G_SPD);
 1738                 if (speed == 10) {
 1739                         AL_REG_MASK_SET(mac_ctrl, ETH_1G_MAC_CMD_CFG_10M_SPD);
 1740                 } else {
 1741                         sgmii_if_mode |= ETH_MAC_SGMII_REG_DATA_IF_MODE_SGMII_SPEED_100;
 1742                         AL_REG_MASK_CLEAR(mac_ctrl, ETH_1G_MAC_CMD_CFG_10M_SPD);
 1743                 }
 1744         }
 1745 
 1746         if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
 1747                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
 1748                                ETH_MAC_SGMII_REG_ADDR_IF_MODE_REG);
 1749                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data,
 1750                                sgmii_if_mode);
 1751 
 1752                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr,
 1753                                ETH_MAC_SGMII_REG_ADDR_CTRL_REG);
 1754                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_data,
 1755                                sgmii_ctrl);
 1756         }
 1757 
 1758         al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, mac_ctrl);
 1759 }
 1760 
 1761 static void al_eth_mac_link_config_10g_mac(
 1762                                 struct al_hal_eth_adapter *adapter,
 1763                                 al_bool force_1000_base_x,
 1764                                 al_bool an_enable,
 1765                                 uint32_t speed,
 1766                                 al_bool full_duplex)
 1767 {
 1768         uint32_t if_mode;
 1769         uint32_t val;
 1770 
 1771         if_mode = al_reg_read32(&adapter->mac_regs_base->mac_10g.if_mode);
 1772 
 1773         if (force_1000_base_x) {
 1774                 uint32_t control;
 1775 
 1776                 AL_REG_MASK_CLEAR(if_mode, ETH_10G_MAC_IF_MODE_SGMII_EN_MASK);
 1777 
 1778                 control = al_reg_read32(&adapter->mac_regs_base->mac_10g.control);
 1779 
 1780                 if (an_enable)
 1781                         AL_REG_MASK_SET(control, ETH_10G_MAC_CONTROL_AN_EN_MASK);
 1782                 else
 1783                         AL_REG_MASK_CLEAR(control, ETH_10G_MAC_CONTROL_AN_EN_MASK);
 1784 
 1785                 al_reg_write32(&adapter->mac_regs_base->mac_10g.control, control);
 1786 
 1787         } else {
 1788                 AL_REG_MASK_SET(if_mode, ETH_10G_MAC_IF_MODE_SGMII_EN_MASK);
 1789                 if (an_enable) {
 1790                         AL_REG_MASK_SET(if_mode, ETH_10G_MAC_IF_MODE_SGMII_AN_MASK);
 1791                 } else {
 1792                         AL_REG_MASK_CLEAR(if_mode, ETH_10G_MAC_IF_MODE_SGMII_AN_MASK);
 1793 
 1794                         if (speed == 1000)
 1795                                 val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_1G;
 1796                         else if (speed == 100)
 1797                                 val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_100M;
 1798                         else
 1799                                 val = ETH_10G_MAC_IF_MODE_SGMII_SPEED_10M;
 1800 
 1801                         AL_REG_FIELD_SET(if_mode,
 1802                                          ETH_10G_MAC_IF_MODE_SGMII_SPEED_MASK,
 1803                                          ETH_10G_MAC_IF_MODE_SGMII_SPEED_SHIFT,
 1804                                          val);
 1805 
 1806                         AL_REG_FIELD_SET(if_mode,
 1807                                          ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_MASK,
 1808                                          ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_SHIFT,
 1809                                          ((full_duplex) ?
 1810                                                 ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_FULL :
 1811                                                 ETH_10G_MAC_IF_MODE_SGMII_DUPLEX_HALF));
 1812                 }
 1813         }
 1814 
 1815         al_reg_write32(&adapter->mac_regs_base->mac_10g.if_mode, if_mode);
 1816 }
 1817 
 1818 /* update link speed and duplex mode */
 1819 int al_eth_mac_link_config(struct al_hal_eth_adapter *adapter,
 1820                            al_bool force_1000_base_x,
 1821                            al_bool an_enable,
 1822                            uint32_t speed,
 1823                            al_bool full_duplex)
 1824 {
 1825         if ((!AL_ETH_IS_1G_MAC(adapter->mac_mode)) &&
 1826                 (adapter->mac_mode != AL_ETH_MAC_MODE_SGMII_2_5G)) {
 1827                 al_err("eth [%s]: this function not supported in this mac mode.\n",
 1828                                adapter->name);
 1829                 return -EINVAL;
 1830         }
 1831 
 1832         if ((adapter->mac_mode != AL_ETH_MAC_MODE_RGMII) && (an_enable)) {
 1833                 /*
 1834                  * an_enable is not relevant to RGMII mode.
 1835                  * in AN mode speed and duplex aren't relevant.
 1836                  */
 1837                 al_info("eth [%s]: set auto negotiation to enable\n", adapter->name);
 1838         } else {
 1839                 al_info("eth [%s]: set link speed to %dMbps. %s duplex.\n", adapter->name,
 1840                         speed, full_duplex == AL_TRUE ? "full" : "half");
 1841 
 1842                 if ((speed != 10) && (speed != 100) && (speed != 1000)) {
 1843                         al_err("eth [%s]: bad speed parameter (%d).\n",
 1844                                        adapter->name, speed);
 1845                         return -EINVAL;
 1846                 }
 1847                 if ((speed == 1000) && (full_duplex == AL_FALSE)) {
 1848                         al_err("eth [%s]: half duplex in 1Gbps is not supported.\n",
 1849                                        adapter->name);
 1850                         return -EINVAL;
 1851                 }
 1852         }
 1853 
 1854         if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
 1855                 al_eth_mac_link_config_1g_mac(adapter,
 1856                                               force_1000_base_x,
 1857                                               an_enable,
 1858                                               speed,
 1859                                               full_duplex);
 1860         else
 1861                 al_eth_mac_link_config_10g_mac(adapter,
 1862                                                force_1000_base_x,
 1863                                                an_enable,
 1864                                                speed,
 1865                                                full_duplex);
 1866 
 1867         return 0;
 1868 }
 1869 
 1870 int al_eth_mac_loopback_config(struct al_hal_eth_adapter *adapter, int enable)
 1871 {
 1872         const char *state = (enable) ? "enable" : "disable";
 1873 
 1874         al_dbg("eth [%s]: loopback %s\n", adapter->name, state);
 1875         if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
 1876                 uint32_t reg;
 1877                 reg = al_reg_read32(&adapter->mac_regs_base->mac_1g.cmd_cfg);
 1878                 if (enable)
 1879                         reg |= AL_BIT(15);
 1880                 else
 1881                         reg &= ~AL_BIT(15);
 1882                 al_reg_write32(&adapter->mac_regs_base->mac_1g.cmd_cfg, reg);
 1883         } else if ((AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode))
 1884                         && (adapter->rev_id == AL_ETH_REV_ID_3)) {
 1885                 uint32_t reg;
 1886                 al_reg_write16(
 1887                         (uint16_t *)&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_CONTROL_1_ADDR);
 1888                 reg = al_reg_read16(
 1889                         (uint16_t *)&adapter->mac_regs_base->kr.pcs_data);
 1890                 if (enable)
 1891                         reg |= AL_BIT(14);
 1892                 else
 1893                         reg &= ~AL_BIT(14);
 1894                 al_reg_write16(
 1895                         (uint16_t *)&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_CONTROL_1_ADDR);
 1896                 al_reg_write16(
 1897                         (uint16_t *)&adapter->mac_regs_base->kr.pcs_data, reg);
 1898         } else if (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G ||
 1899                         (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
 1900                 uint32_t reg;
 1901                 reg = al_eth_40g_pcs_reg_read(adapter, ETH_MAC_GEN_V3_PCS_40G_CONTROL_STATUS_ADDR);
 1902                 if (enable)
 1903                         reg |= AL_BIT(14);
 1904                 else
 1905                         reg &= ~AL_BIT(14);
 1906                 al_eth_40g_pcs_reg_write(adapter, ETH_MAC_GEN_V3_PCS_40G_CONTROL_STATUS_ADDR, reg);
 1907         } else {
 1908                 al_err("Eth: mac loopback not supported in this mode %d", adapter->mac_mode);
 1909                 return -EPERM;
 1910         }
 1911         return 0;
 1912 }
 1913 
 1914 /* MDIO */
 1915 int al_eth_mdio_config(
 1916         struct al_hal_eth_adapter       *adapter,
 1917         enum al_eth_mdio_type           mdio_type,
 1918         al_bool                         shared_mdio_if,
 1919         enum al_eth_ref_clk_freq        ref_clk_freq,
 1920         unsigned int                    mdio_clk_freq_khz)
 1921 {
 1922         enum al_eth_mdio_if mdio_if = AL_ETH_MDIO_IF_10G_MAC;
 1923         const char *if_name = (mdio_if == AL_ETH_MDIO_IF_1G_MAC) ? "10/100/1G MAC" : "10G MAC";
 1924         const char *type_name = (mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22) ? "Clause 22" : "Clause 45";
 1925         const char *shared_name = (shared_mdio_if == AL_TRUE) ? "Yes" : "No";
 1926 
 1927         unsigned int ref_clk_freq_khz;
 1928         uint32_t val;
 1929 
 1930         al_dbg("eth [%s]: mdio config: interface %s. type %s. shared: %s\n", adapter->name, if_name, type_name, shared_name);
 1931         adapter->shared_mdio_if = shared_mdio_if;
 1932 
 1933         val = al_reg_read32(&adapter->mac_regs_base->gen.cfg);
 1934         al_dbg("eth [%s]: mdio config: 10G mac \n", adapter->name);
 1935 
 1936         switch(mdio_if)
 1937         {
 1938                 case AL_ETH_MDIO_IF_1G_MAC:
 1939                         val &= ~AL_BIT(10);
 1940                         break;
 1941                 case AL_ETH_MDIO_IF_10G_MAC:
 1942                         val |= AL_BIT(10);
 1943                         break;
 1944         }
 1945         al_reg_write32(&adapter->mac_regs_base->gen.cfg, val);
 1946         adapter->mdio_if = mdio_if;
 1947 
 1948 
 1949         if (mdio_if == AL_ETH_MDIO_IF_10G_MAC)
 1950         {
 1951                 val = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
 1952                 switch(mdio_type)
 1953                 {
 1954                         case AL_ETH_MDIO_TYPE_CLAUSE_22:
 1955                                 val &= ~AL_BIT(6);
 1956                                 break;
 1957                         case AL_ETH_MDIO_TYPE_CLAUSE_45:
 1958                                 val |= AL_BIT(6);
 1959                                 break;
 1960                 }
 1961 
 1962                 /* set clock div to get 'mdio_clk_freq_khz' */
 1963                 switch (ref_clk_freq) {
 1964                 default:
 1965                         al_err("eth [%s]: %s: invalid reference clock frequency"
 1966                                 " (%d)\n",
 1967                                 adapter->name, __func__, ref_clk_freq);
 1968                 case AL_ETH_REF_FREQ_375_MHZ:
 1969                         ref_clk_freq_khz = 375000;
 1970                         break;
 1971                 case AL_ETH_REF_FREQ_187_5_MHZ:
 1972                         ref_clk_freq_khz = 187500;
 1973                         break;
 1974                 case AL_ETH_REF_FREQ_250_MHZ:
 1975                         ref_clk_freq_khz = 250000;
 1976                         break;
 1977                 case AL_ETH_REF_FREQ_500_MHZ:
 1978                         ref_clk_freq_khz = 500000;
 1979                         break;
 1980                 case AL_ETH_REF_FREQ_428_MHZ:
 1981                         ref_clk_freq_khz = 428000;
 1982                         break;
 1983                 };
 1984 
 1985                 val &= ~(0x1FF << 7);
 1986                 val |= (ref_clk_freq_khz / (2 * mdio_clk_freq_khz)) << 7;
 1987                 AL_REG_FIELD_SET(val, ETH_10G_MAC_MDIO_CFG_HOLD_TIME_MASK,
 1988                                  ETH_10G_MAC_MDIO_CFG_HOLD_TIME_SHIFT,
 1989                                  ETH_10G_MAC_MDIO_CFG_HOLD_TIME_7_CLK);
 1990                 al_reg_write32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status, val);
 1991         }else{
 1992                 if(mdio_type != AL_ETH_MDIO_TYPE_CLAUSE_22) {
 1993                         al_err("eth [%s] mdio type not supported for this interface\n",
 1994                                  adapter->name);
 1995                         return -EINVAL;
 1996                 }
 1997         }
 1998         adapter->mdio_type = mdio_type;
 1999 
 2000         return 0;
 2001 }
 2002 
 2003 static int al_eth_mdio_1g_mac_read(struct al_hal_eth_adapter *adapter,
 2004                             uint32_t phy_addr __attribute__((__unused__)),
 2005                             uint32_t reg, uint16_t *val)
 2006 {
 2007         *val = al_reg_read32(
 2008                 &adapter->mac_regs_base->mac_1g.phy_regs_base + reg);
 2009         return 0;
 2010 }
 2011 
 2012 static int al_eth_mdio_1g_mac_write(struct al_hal_eth_adapter *adapter,
 2013                              uint32_t phy_addr __attribute__((__unused__)),
 2014                              uint32_t reg, uint16_t val)
 2015 {
 2016         al_reg_write32(
 2017                 &adapter->mac_regs_base->mac_1g.phy_regs_base + reg, val);
 2018         return 0;
 2019 }
 2020 
 2021 static int al_eth_mdio_10g_mac_wait_busy(struct al_hal_eth_adapter *adapter)
 2022 {
 2023         int     count = 0;
 2024         uint32_t mdio_cfg_status;
 2025 
 2026         do {
 2027                 mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
 2028 /*
 2029                 if (mdio_cfg_status & AL_BIT(1)){ //error
 2030                         al_err(" %s mdio read failed on error. phy_addr 0x%x reg 0x%x\n",
 2031                                 udma_params.name, phy_addr, reg);
 2032                         return -EIO;
 2033                 }*/
 2034                 if (mdio_cfg_status & AL_BIT(0)){
 2035                         if (count > 0)
 2036                                 al_dbg("eth [%s] mdio: still busy!\n", adapter->name);
 2037                 }else{
 2038                         return 0;
 2039                 }
 2040                 al_udelay(AL_ETH_MDIO_DELAY_PERIOD);
 2041         }while(count++ < AL_ETH_MDIO_DELAY_COUNT);
 2042 
 2043         return -ETIMEDOUT;
 2044 }
 2045 
 2046 static int al_eth_mdio_10g_mac_type22(
 2047         struct al_hal_eth_adapter *adapter,
 2048         int read, uint32_t phy_addr, uint32_t reg, uint16_t *val)
 2049 {
 2050         int rc;
 2051         const char *op = (read == 1) ? "read":"write";
 2052         uint32_t mdio_cfg_status;
 2053         uint16_t mdio_cmd;
 2054 
 2055         //wait if the HW is busy
 2056         rc = al_eth_mdio_10g_mac_wait_busy(adapter);
 2057         if (rc) {
 2058                 al_err(" eth [%s] mdio %s failed. HW is busy\n", adapter->name, op);
 2059                 return rc;
 2060         }
 2061 
 2062         mdio_cmd = (uint16_t)(0x1F & reg);
 2063         mdio_cmd |= (0x1F & phy_addr) << 5;
 2064 
 2065         if (read)
 2066                 mdio_cmd |= AL_BIT(15); //READ command
 2067 
 2068         al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_cmd,
 2069                         mdio_cmd);
 2070         if (!read)
 2071                 al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_data,
 2072                                 *val);
 2073 
 2074         //wait for the busy to clear
 2075         rc = al_eth_mdio_10g_mac_wait_busy(adapter);
 2076         if (rc != 0) {
 2077                 al_err(" %s mdio %s failed on timeout\n", adapter->name, op);
 2078                 return -ETIMEDOUT;
 2079         }
 2080 
 2081         mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
 2082 
 2083         if (mdio_cfg_status & AL_BIT(1)){ //error
 2084                 al_err(" %s mdio %s failed on error. phy_addr 0x%x reg 0x%x\n",
 2085                         adapter->name, op, phy_addr, reg);
 2086                         return -EIO;
 2087         }
 2088         if (read)
 2089                 *val = al_reg_read16(
 2090                         (uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data);
 2091         return 0;
 2092 }
 2093 
 2094 static int al_eth_mdio_10g_mac_type45(
 2095         struct al_hal_eth_adapter *adapter,
 2096         int read, uint32_t port_addr, uint32_t device, uint32_t reg, uint16_t *val)
 2097 {
 2098         int rc;
 2099         const char *op = (read == 1) ? "read":"write";
 2100         uint32_t mdio_cfg_status;
 2101         uint16_t mdio_cmd;
 2102 
 2103         //wait if the HW is busy
 2104         rc = al_eth_mdio_10g_mac_wait_busy(adapter);
 2105         if (rc) {
 2106                 al_err(" %s mdio %s failed. HW is busy\n", adapter->name, op);
 2107                 return rc;
 2108         }
 2109         // set command register
 2110         mdio_cmd = (uint16_t)(0x1F & device);
 2111         mdio_cmd |= (0x1F & port_addr) << 5;
 2112         al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_cmd,
 2113                         mdio_cmd);
 2114 
 2115         // send address frame
 2116         al_reg_write16(&adapter->mac_regs_base->mac_10g.mdio_regaddr, reg);
 2117         //wait for the busy to clear
 2118         rc = al_eth_mdio_10g_mac_wait_busy(adapter);
 2119         if (rc) {
 2120                 al_err(" %s mdio %s (address frame) failed on timeout\n", adapter->name, op);
 2121                 return rc;
 2122         }
 2123 
 2124         // if read, write again to the command register with READ bit set
 2125         if (read) {
 2126                 mdio_cmd |= AL_BIT(15); //READ command
 2127                 al_reg_write16(
 2128                         (uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_cmd,
 2129                         mdio_cmd);
 2130         } else {
 2131                 al_reg_write16(
 2132                         (uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data,
 2133                         *val);
 2134         }
 2135         //wait for the busy to clear
 2136         rc = al_eth_mdio_10g_mac_wait_busy(adapter);
 2137         if (rc) {
 2138                 al_err(" %s mdio %s failed on timeout\n", adapter->name, op);
 2139                 return rc;
 2140         }
 2141 
 2142         mdio_cfg_status = al_reg_read32(&adapter->mac_regs_base->mac_10g.mdio_cfg_status);
 2143 
 2144         if (mdio_cfg_status & AL_BIT(1)){ //error
 2145                 al_err(" %s mdio %s failed on error. port 0x%x, device 0x%x reg 0x%x\n",
 2146                         adapter->name, op, port_addr, device, reg);
 2147                         return -EIO;
 2148         }
 2149         if (read)
 2150                 *val = al_reg_read16(
 2151                         (uint16_t *)&adapter->mac_regs_base->mac_10g.mdio_data);
 2152         return 0;
 2153 }
 2154 
 2155 /**
 2156  * acquire mdio interface ownership
 2157  * when mdio interface shared between multiple eth controllers, this function waits until the ownership granted for this controller.
 2158  * this function does nothing when the mdio interface is used only by this controller.
 2159  *
 2160  * @param adapter
 2161  * @return 0 on success, -ETIMEDOUT  on timeout.
 2162  */
 2163 static int al_eth_mdio_lock(struct al_hal_eth_adapter *adapter)
 2164 {
 2165         int     count = 0;
 2166         uint32_t mdio_ctrl_1;
 2167 
 2168         if (adapter->shared_mdio_if == AL_FALSE)
 2169                 return 0; /* nothing to do when interface is not shared */
 2170 
 2171         do {
 2172                 mdio_ctrl_1 = al_reg_read32(&adapter->mac_regs_base->gen.mdio_ctrl_1);
 2173 /*
 2174                 if (mdio_cfg_status & AL_BIT(1)){ //error
 2175                         al_err(" %s mdio read failed on error. phy_addr 0x%x reg 0x%x\n",
 2176                                 udma_params.name, phy_addr, reg);
 2177                         return -EIO;
 2178                 }*/
 2179                 if (mdio_ctrl_1 & AL_BIT(0)){
 2180                         if (count > 0)
 2181                                 al_dbg("eth %s mdio interface still busy!\n", adapter->name);
 2182                 }else{
 2183                         return 0;
 2184                 }
 2185                 al_udelay(AL_ETH_MDIO_DELAY_PERIOD);
 2186         }while(count++ < (AL_ETH_MDIO_DELAY_COUNT * 4));
 2187         al_err(" %s mdio failed to take ownership. MDIO info reg: 0x%08x\n",
 2188                 adapter->name, al_reg_read32(&adapter->mac_regs_base->gen.mdio_1));
 2189 
 2190         return -ETIMEDOUT;
 2191 }
 2192 
 2193 /**
 2194  * free mdio interface ownership
 2195  * when mdio interface shared between multiple eth controllers, this function releases the ownership granted for this controller.
 2196  * this function does nothing when the mdio interface is used only by this controller.
 2197  *
 2198  * @param adapter
 2199  * @return 0.
 2200  */
 2201 static int al_eth_mdio_free(struct al_hal_eth_adapter *adapter)
 2202 {
 2203         if (adapter->shared_mdio_if == AL_FALSE)
 2204                 return 0; /* nothing to do when interface is not shared */
 2205 
 2206         al_reg_write32(&adapter->mac_regs_base->gen.mdio_ctrl_1, 0);
 2207 
 2208         /*
 2209          * Addressing RMN: 2917
 2210          *
 2211          * RMN description:
 2212          * The HW spin-lock is stateless and doesn't maintain any scheduling
 2213          * policy.
 2214          *
 2215          * Software flow:
 2216          * After getting the lock wait 2 times the delay period in order to give
 2217          * the other port chance to take the lock and prevent starvation.
 2218          * This is not scalable to more than two ports.
 2219          */
 2220         al_udelay(2 * AL_ETH_MDIO_DELAY_PERIOD);
 2221 
 2222         return 0;
 2223 }
 2224 
 2225 int al_eth_mdio_read(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, uint32_t device, uint32_t reg, uint16_t *val)
 2226 {
 2227         int rc;
 2228         rc = al_eth_mdio_lock(adapter);
 2229 
 2230         /*"interface ownership taken"*/
 2231         if (rc)
 2232                 return rc;
 2233 
 2234         if (adapter->mdio_if == AL_ETH_MDIO_IF_1G_MAC)
 2235                 rc = al_eth_mdio_1g_mac_read(adapter, phy_addr, reg, val);
 2236         else
 2237                 if (adapter->mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22)
 2238                         rc = al_eth_mdio_10g_mac_type22(adapter, 1, phy_addr, reg, val);
 2239                 else
 2240                         rc = al_eth_mdio_10g_mac_type45(adapter, 1, phy_addr, device, reg, val);
 2241 
 2242         al_eth_mdio_free(adapter);
 2243         al_dbg("eth mdio read: phy_addr %x, device %x, reg %x val %x\n", phy_addr, device, reg, *val);
 2244         return rc;
 2245 }
 2246 
 2247 int al_eth_mdio_write(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, uint32_t device, uint32_t reg, uint16_t val)
 2248 {
 2249         int rc;
 2250         al_dbg("eth mdio write: phy_addr %x, device %x, reg %x, val %x\n", phy_addr, device, reg, val);
 2251         rc = al_eth_mdio_lock(adapter);
 2252         /* interface ownership taken */
 2253         if (rc)
 2254                 return rc;
 2255 
 2256         if (adapter->mdio_if == AL_ETH_MDIO_IF_1G_MAC)
 2257                 rc = al_eth_mdio_1g_mac_write(adapter, phy_addr, reg, val);
 2258         else
 2259                 if (adapter->mdio_type == AL_ETH_MDIO_TYPE_CLAUSE_22)
 2260                         rc = al_eth_mdio_10g_mac_type22(adapter, 0, phy_addr, reg, &val);
 2261                 else
 2262                         rc = al_eth_mdio_10g_mac_type45(adapter, 0, phy_addr, device, reg, &val);
 2263 
 2264         al_eth_mdio_free(adapter);
 2265         return rc;
 2266 }
 2267 
 2268 static void al_dump_tx_desc(union al_udma_desc *tx_desc)
 2269 {
 2270         uint32_t *ptr = (uint32_t *)tx_desc;
 2271         al_dbg("eth tx desc:\n");
 2272         al_dbg("0x%08x\n", *(ptr++));
 2273         al_dbg("0x%08x\n", *(ptr++));
 2274         al_dbg("0x%08x\n", *(ptr++));
 2275         al_dbg("0x%08x\n", *(ptr++));
 2276 }
 2277 
 2278 static void
 2279 al_dump_tx_pkt(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt)
 2280 {
 2281         const char *tso = (pkt->flags & AL_ETH_TX_FLAGS_TSO) ? "TSO" : "";
 2282         const char *l3_csum = (pkt->flags & AL_ETH_TX_FLAGS_IPV4_L3_CSUM) ? "L3 CSUM" : "";
 2283         const char *l4_csum = (pkt->flags & AL_ETH_TX_FLAGS_L4_CSUM) ?
 2284           ((pkt->flags & AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM) ? "L4 PARTIAL CSUM" : "L4 FULL CSUM") : "";
 2285         const char *fcs = (pkt->flags & AL_ETH_TX_FLAGS_L2_DIS_FCS) ? "Disable FCS" : "";
 2286         const char *ptp = (pkt->flags & AL_ETH_TX_FLAGS_TS) ? "TX_PTP" : "";
 2287         const char *l3_proto_name = "unknown";
 2288         const char *l4_proto_name = "unknown";
 2289         const char *outer_l3_proto_name = "N/A";
 2290         const char *tunnel_mode = (((pkt->tunnel_mode &
 2291                                 AL_ETH_TUNNEL_WITH_UDP) == AL_ETH_TUNNEL_WITH_UDP) ?
 2292                                 "TUNNEL_WITH_UDP" :
 2293                                 (((pkt->tunnel_mode &
 2294                                 AL_ETH_TUNNEL_NO_UDP) == AL_ETH_TUNNEL_NO_UDP) ?
 2295                                 "TUNNEL_NO_UDP" : ""));
 2296         uint32_t total_len = 0;
 2297         int i;
 2298 
 2299         al_dbg("[%s %d]: flags: %s %s %s %s %s %s\n", tx_dma_q->udma->name, tx_dma_q->qid,
 2300                  tso, l3_csum, l4_csum, fcs, ptp, tunnel_mode);
 2301 
 2302         switch (pkt->l3_proto_idx) {
 2303         case AL_ETH_PROTO_ID_IPv4:
 2304                 l3_proto_name = "IPv4";
 2305                 break;
 2306         case AL_ETH_PROTO_ID_IPv6:
 2307                 l3_proto_name = "IPv6";
 2308                 break;
 2309         default:
 2310                 l3_proto_name = "unknown";
 2311                 break;
 2312         }
 2313 
 2314         switch (pkt->l4_proto_idx) {
 2315         case AL_ETH_PROTO_ID_TCP:
 2316                 l4_proto_name = "TCP";
 2317                 break;
 2318         case AL_ETH_PROTO_ID_UDP:
 2319                 l4_proto_name = "UDP";
 2320                 break;
 2321         default:
 2322                 l4_proto_name = "unknown";
 2323                 break;
 2324         }
 2325 
 2326         switch (pkt->outer_l3_proto_idx) {
 2327         case AL_ETH_PROTO_ID_IPv4:
 2328                 outer_l3_proto_name = "IPv4";
 2329                 break;
 2330         case AL_ETH_PROTO_ID_IPv6:
 2331                 outer_l3_proto_name = "IPv6";
 2332                 break;
 2333         default:
 2334                 outer_l3_proto_name = "N/A";
 2335                 break;
 2336         }
 2337 
 2338         al_dbg("[%s %d]: L3 proto: %d (%s). L4 proto: %d (%s). Outer_L3 proto: %d (%s). vlan source count %d. mod add %d. mod del %d\n",
 2339                         tx_dma_q->udma->name, tx_dma_q->qid, pkt->l3_proto_idx,
 2340                         l3_proto_name, pkt->l4_proto_idx, l4_proto_name,
 2341                         pkt->outer_l3_proto_idx, outer_l3_proto_name,
 2342                         pkt->source_vlan_count, pkt->vlan_mod_add_count,
 2343                         pkt->vlan_mod_del_count);
 2344 
 2345         if (pkt->meta) {
 2346                 const char * store = pkt->meta->store ? "Yes" : "No";
 2347                 const char *ptp_val = (pkt->flags & AL_ETH_TX_FLAGS_TS) ? "Yes" : "No";
 2348 
 2349                 al_dbg("[%s %d]: tx pkt with meta data. words valid %x\n",
 2350                         tx_dma_q->udma->name, tx_dma_q->qid,
 2351                         pkt->meta->words_valid);
 2352                 al_dbg("[%s %d]: meta: store to cache %s. l3 hdr len %d. l3 hdr offset %d. "
 2353                         "l4 hdr len %d. mss val %d ts_index %d ts_val:%s\n"
 2354                         , tx_dma_q->udma->name, tx_dma_q->qid, store,
 2355                         pkt->meta->l3_header_len, pkt->meta->l3_header_offset,
 2356                         pkt->meta->l4_header_len, pkt->meta->mss_val,
 2357                         pkt->meta->ts_index, ptp_val);
 2358                 al_dbg("outer_l3_hdr_offset %d. outer_l3_len %d.\n",
 2359                         pkt->meta->outer_l3_offset, pkt->meta->outer_l3_len);
 2360         }
 2361 
 2362         al_dbg("[%s %d]: num of bufs: %d\n", tx_dma_q->udma->name, tx_dma_q->qid,
 2363                 pkt->num_of_bufs);
 2364         for (i = 0; i < pkt->num_of_bufs; i++) {
 2365                 al_dbg("eth [%s %d]: buf[%d]: len 0x%08x. address 0x%016llx\n", tx_dma_q->udma->name, tx_dma_q->qid,
 2366                         i, pkt->bufs[i].len, (unsigned long long)pkt->bufs[i].addr);
 2367                 total_len += pkt->bufs[i].len;
 2368         }
 2369         al_dbg("[%s %d]: total len: 0x%08x\n", tx_dma_q->udma->name, tx_dma_q->qid, total_len);
 2370 
 2371 }
 2372 
 2373 /* TX */
 2374 /**
 2375  * add packet to transmission queue
 2376  */
 2377 int al_eth_tx_pkt_prepare(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt)
 2378 {
 2379         union al_udma_desc *tx_desc;
 2380         uint32_t tx_descs;
 2381         uint32_t flags = AL_M2S_DESC_FIRST |
 2382                         AL_M2S_DESC_CONCAT |
 2383                         (pkt->flags & AL_ETH_TX_FLAGS_INT);
 2384         uint64_t tgtid = ((uint64_t)pkt->tgtid) << AL_UDMA_DESC_TGTID_SHIFT;
 2385         uint32_t meta_ctrl;
 2386         uint32_t ring_id;
 2387         int buf_idx;
 2388 
 2389         al_dbg("[%s %d]: new tx pkt\n", tx_dma_q->udma->name, tx_dma_q->qid);
 2390 
 2391         al_dump_tx_pkt(tx_dma_q, pkt);
 2392 
 2393         tx_descs = pkt->num_of_bufs;
 2394         if (pkt->meta) {
 2395                 tx_descs += 1;
 2396         }
 2397 #ifdef AL_ETH_EX
 2398         al_assert((pkt->ext_meta_data == NULL) || (tx_dma_q->adapter_rev_id > AL_ETH_REV_ID_2));
 2399 
 2400         tx_descs += al_eth_ext_metadata_needed_descs(pkt->ext_meta_data);
 2401         al_dbg("[%s %d]: %d Descriptors: ext_meta (%d). meta (%d). buffer (%d) ",
 2402                         tx_dma_q->udma->name, tx_dma_q->qid, tx_descs,
 2403                         al_eth_ext_metadata_needed_descs(pkt->ext_meta_data),
 2404                         (pkt->meta != NULL), pkt->num_of_bufs);
 2405 #endif
 2406 
 2407         if (unlikely(al_udma_available_get(tx_dma_q) < tx_descs)) {
 2408                 al_dbg("[%s %d]: failed to allocate (%d) descriptors",
 2409                          tx_dma_q->udma->name, tx_dma_q->qid, tx_descs);
 2410                 return 0;
 2411         }
 2412 
 2413 #ifdef AL_ETH_EX
 2414         if (pkt->ext_meta_data != NULL) {
 2415                 al_eth_ext_metadata_create(tx_dma_q, &flags, pkt->ext_meta_data);
 2416                 flags &= ~(AL_M2S_DESC_FIRST | AL_ETH_TX_FLAGS_INT);
 2417         }
 2418 #endif
 2419 
 2420         if (pkt->meta) {
 2421                 uint32_t meta_word_0 = 0;
 2422                 uint32_t meta_word_1 = 0;
 2423                 uint32_t meta_word_2 = 0;
 2424                 uint32_t meta_word_3 = 0;
 2425 
 2426                 meta_word_0 |= flags | AL_M2S_DESC_META_DATA;
 2427                 meta_word_0 &=  ~AL_M2S_DESC_CONCAT;
 2428                 flags &= ~(AL_M2S_DESC_FIRST | AL_ETH_TX_FLAGS_INT);
 2429 
 2430                 tx_desc = al_udma_desc_get(tx_dma_q);
 2431                 /* get ring id, and clear FIRST and Int flags */
 2432                 ring_id = al_udma_ring_id_get(tx_dma_q) <<
 2433                         AL_M2S_DESC_RING_ID_SHIFT;
 2434 
 2435                 meta_word_0 |= ring_id;
 2436                 meta_word_0 |= pkt->meta->words_valid << 12;
 2437 
 2438                 if (pkt->meta->store)
 2439                         meta_word_0 |= AL_ETH_TX_META_STORE;
 2440 
 2441                 if (pkt->meta->words_valid & 1) {
 2442                         meta_word_0 |= pkt->meta->vlan1_cfi_sel;
 2443                         meta_word_0 |= pkt->meta->vlan2_vid_sel << 2;
 2444                         meta_word_0 |= pkt->meta->vlan2_cfi_sel << 4;
 2445                         meta_word_0 |= pkt->meta->vlan2_pbits_sel << 6;
 2446                         meta_word_0 |= pkt->meta->vlan2_ether_sel << 8;
 2447                 }
 2448 
 2449                 if (pkt->meta->words_valid & 2) {
 2450                         meta_word_1 = pkt->meta->vlan1_new_vid;
 2451                         meta_word_1 |= pkt->meta->vlan1_new_cfi << 12;
 2452                         meta_word_1 |= pkt->meta->vlan1_new_pbits << 13;
 2453                         meta_word_1 |= pkt->meta->vlan2_new_vid << 16;
 2454                         meta_word_1 |= pkt->meta->vlan2_new_cfi << 28;
 2455                         meta_word_1 |= pkt->meta->vlan2_new_pbits << 29;
 2456                 }
 2457 
 2458                 if (pkt->meta->words_valid & 4) {
 2459                         uint32_t l3_offset;
 2460 
 2461                         meta_word_2 = pkt->meta->l3_header_len & AL_ETH_TX_META_L3_LEN_MASK;
 2462                         meta_word_2 |= (pkt->meta->l3_header_offset & AL_ETH_TX_META_L3_OFF_MASK) <<
 2463                                 AL_ETH_TX_META_L3_OFF_SHIFT;
 2464                         meta_word_2 |= (pkt->meta->l4_header_len & 0x3f) << 16;
 2465 
 2466                         if (unlikely(pkt->flags & AL_ETH_TX_FLAGS_TS))
 2467                                 meta_word_0 |= pkt->meta->ts_index <<
 2468                                         AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT;
 2469                         else
 2470                                 meta_word_0 |= (((pkt->meta->mss_val & 0x3c00) >> 10)
 2471                                                 << AL_ETH_TX_META_MSS_MSB_TS_VAL_SHIFT);
 2472                         meta_word_2 |= ((pkt->meta->mss_val & 0x03ff)
 2473                                         << AL_ETH_TX_META_MSS_LSB_VAL_SHIFT);
 2474 
 2475                         /*
 2476                          * move from bytes to multiplication of 2 as the HW
 2477                          * expect to get it
 2478                          */
 2479                         l3_offset = (pkt->meta->outer_l3_offset >> 1);
 2480 
 2481                         meta_word_0 |=
 2482                                 (((l3_offset &
 2483                                    AL_ETH_TX_META_OUTER_L3_OFF_HIGH_MASK) >> 3)
 2484                                    << AL_ETH_TX_META_OUTER_L3_OFF_HIGH_SHIFT);
 2485 
 2486                         meta_word_3 |=
 2487                                 ((l3_offset &
 2488                                    AL_ETH_TX_META_OUTER_L3_OFF_LOW_MASK)
 2489                                    << AL_ETH_TX_META_OUTER_L3_OFF_LOW_SHIFT);
 2490 
 2491                         /*
 2492                          * shift right 2 bits to work in multiplication of 4
 2493                          * as the HW expect to get it
 2494                          */
 2495                         meta_word_3 |=
 2496                                 (((pkt->meta->outer_l3_len >> 2) &
 2497                                    AL_ETH_TX_META_OUTER_L3_LEN_MASK)
 2498                                    << AL_ETH_TX_META_OUTER_L3_LEN_SHIFT);
 2499                 }
 2500 
 2501                 tx_desc->tx_meta.len_ctrl = swap32_to_le(meta_word_0);
 2502                 tx_desc->tx_meta.meta_ctrl = swap32_to_le(meta_word_1);
 2503                 tx_desc->tx_meta.meta1 = swap32_to_le(meta_word_2);
 2504                 tx_desc->tx_meta.meta2 = swap32_to_le(meta_word_3);
 2505                 al_dump_tx_desc(tx_desc);
 2506         }
 2507 
 2508         meta_ctrl = pkt->flags & AL_ETH_TX_PKT_META_FLAGS;
 2509 
 2510         /* L4_PARTIAL_CSUM without L4_CSUM is invalid option  */
 2511         al_assert((pkt->flags & (AL_ETH_TX_FLAGS_L4_CSUM|AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM)) !=
 2512                   AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM);
 2513 
 2514         /* TSO packets can't have Timestamp enabled */
 2515         al_assert((pkt->flags & (AL_ETH_TX_FLAGS_TSO|AL_ETH_TX_FLAGS_TS)) !=
 2516                   (AL_ETH_TX_FLAGS_TSO|AL_ETH_TX_FLAGS_TS));
 2517 
 2518         meta_ctrl |= pkt->l3_proto_idx;
 2519         meta_ctrl |= pkt->l4_proto_idx << AL_ETH_TX_L4_PROTO_IDX_SHIFT;
 2520         meta_ctrl |= pkt->source_vlan_count << AL_ETH_TX_SRC_VLAN_CNT_SHIFT;
 2521         meta_ctrl |= pkt->vlan_mod_add_count << AL_ETH_TX_VLAN_MOD_ADD_SHIFT;
 2522         meta_ctrl |= pkt->vlan_mod_del_count << AL_ETH_TX_VLAN_MOD_DEL_SHIFT;
 2523         meta_ctrl |= pkt->vlan_mod_v1_ether_sel << AL_ETH_TX_VLAN_MOD_E_SEL_SHIFT;
 2524         meta_ctrl |= pkt->vlan_mod_v1_vid_sel << AL_ETH_TX_VLAN_MOD_VID_SEL_SHIFT;
 2525         meta_ctrl |= pkt->vlan_mod_v1_pbits_sel << AL_ETH_TX_VLAN_MOD_PBIT_SEL_SHIFT;
 2526 
 2527 #ifdef AL_ETH_EX
 2528         if ((pkt->ext_meta_data != NULL) && (pkt->ext_meta_data->tx_crypto_data != NULL))
 2529                 meta_ctrl |= AL_ETH_TX_FLAGS_ENCRYPT;
 2530 #endif
 2531 
 2532         meta_ctrl |= pkt->tunnel_mode << AL_ETH_TX_TUNNEL_MODE_SHIFT;
 2533         if (pkt->outer_l3_proto_idx == AL_ETH_PROTO_ID_IPv4)
 2534                 meta_ctrl |= 1 << AL_ETH_TX_OUTER_L3_PROTO_SHIFT;
 2535 
 2536         flags |= pkt->flags & AL_ETH_TX_PKT_UDMA_FLAGS;
 2537         for(buf_idx = 0; buf_idx < pkt->num_of_bufs; buf_idx++ ) {
 2538                 uint32_t flags_len = flags;
 2539 
 2540                 tx_desc = al_udma_desc_get(tx_dma_q);
 2541                 /* get ring id, and clear FIRST and Int flags */
 2542                 ring_id = al_udma_ring_id_get(tx_dma_q) <<
 2543                         AL_M2S_DESC_RING_ID_SHIFT;
 2544 
 2545                 flags_len |= ring_id;
 2546 
 2547                 if (buf_idx == (pkt->num_of_bufs - 1))
 2548                         flags_len |= AL_M2S_DESC_LAST;
 2549 
 2550                 /* clear First and Int flags */
 2551                 flags &= AL_ETH_TX_FLAGS_NO_SNOOP;
 2552                 flags |= AL_M2S_DESC_CONCAT;
 2553 
 2554                 flags_len |= pkt->bufs[buf_idx].len & AL_M2S_DESC_LEN_MASK;
 2555                 tx_desc->tx.len_ctrl = swap32_to_le(flags_len);
 2556                 if (buf_idx == 0)
 2557                         tx_desc->tx.meta_ctrl = swap32_to_le(meta_ctrl);
 2558                 tx_desc->tx.buf_ptr = swap64_to_le(
 2559                         pkt->bufs[buf_idx].addr | tgtid);
 2560                 al_dump_tx_desc(tx_desc);
 2561         }
 2562 
 2563         al_dbg("[%s %d]: pkt descriptors written into the tx queue. descs num (%d)\n",
 2564                 tx_dma_q->udma->name, tx_dma_q->qid, tx_descs);
 2565 
 2566         return tx_descs;
 2567 }
 2568 
 2569 
 2570 void al_eth_tx_dma_action(struct al_udma_q *tx_dma_q, uint32_t tx_descs)
 2571 {
 2572         /* add tx descriptors */
 2573         al_udma_desc_action_add(tx_dma_q, tx_descs);
 2574 }
 2575 
 2576 /**
 2577  * get number of completed tx descriptors, upper layer should derive from
 2578  */
 2579 int al_eth_comp_tx_get(struct al_udma_q *tx_dma_q)
 2580 {
 2581         int rc;
 2582 
 2583         rc = al_udma_cdesc_get_all(tx_dma_q, NULL);
 2584         if (rc != 0) {
 2585                 al_udma_cdesc_ack(tx_dma_q, rc);
 2586                 al_dbg("[%s %d]: tx completion: descs (%d)\n",
 2587                          tx_dma_q->udma->name, tx_dma_q->qid, rc);
 2588         }
 2589 
 2590         return rc;
 2591 }
 2592 
 2593 /**
 2594  * configure the TSO MSS val
 2595  */
 2596 int al_eth_tso_mss_config(struct al_hal_eth_adapter *adapter, uint8_t idx, uint32_t mss_val)
 2597 {
 2598 
 2599         al_assert(idx <= 8); /*valid MSS index*/
 2600         al_assert(mss_val <= AL_ETH_TSO_MSS_MAX_VAL); /*valid MSS val*/
 2601         al_assert(mss_val >= AL_ETH_TSO_MSS_MIN_VAL); /*valid MSS val*/
 2602 
 2603         al_reg_write32(&adapter->ec_regs_base->tso_sel[idx].mss, mss_val);
 2604         return 0;
 2605 }
 2606 
 2607 
 2608 /* RX */
 2609 /**
 2610  * config the rx descriptor fields
 2611  */
 2612 void al_eth_rx_desc_config(
 2613                         struct al_hal_eth_adapter *adapter,
 2614                         enum al_eth_rx_desc_lro_context_val_res lro_sel,
 2615                         enum al_eth_rx_desc_l4_offset_sel l4_offset_sel,
 2616                         enum al_eth_rx_desc_l3_offset_sel l3_offset_sel,
 2617                         enum al_eth_rx_desc_l4_chk_res_sel l4_sel,
 2618                         enum al_eth_rx_desc_l3_chk_res_sel l3_sel,
 2619                         enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel,
 2620                         enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel,
 2621                         enum al_eth_rx_desc_frag_sel frag_sel)
 2622 {
 2623         uint32_t reg_val = 0;
 2624 
 2625         reg_val |= (lro_sel == AL_ETH_L4_OFFSET) ?
 2626                         EC_RFW_CFG_A_0_LRO_CONTEXT_SEL : 0;
 2627 
 2628         reg_val |= (l4_sel == AL_ETH_L4_INNER_OUTER_CHK) ?
 2629                         EC_RFW_CFG_A_0_META_L4_CHK_RES_SEL : 0;
 2630 
 2631         reg_val |= l3_sel << EC_RFW_CFG_A_0_META_L3_CHK_RES_SEL_SHIFT;
 2632 
 2633         al_reg_write32(&adapter->ec_regs_base->rfw.cfg_a_0, reg_val);
 2634 
 2635         reg_val = al_reg_read32(&adapter->ec_regs_base->rfw.meta);
 2636         if (l3_proto_sel == AL_ETH_L3_PROTO_IDX_INNER)
 2637                 reg_val |= EC_RFW_META_L3_PROT_SEL;
 2638         else
 2639                 reg_val &= ~EC_RFW_META_L3_PROT_SEL;
 2640 
 2641         if (l4_proto_sel == AL_ETH_L4_PROTO_IDX_INNER)
 2642                 reg_val |= EC_RFW_META_L4_PROT_SEL;
 2643         else
 2644                 reg_val &= ~EC_RFW_META_L4_PROT_SEL;
 2645 
 2646         if (l4_offset_sel == AL_ETH_L4_OFFSET_INNER)
 2647                 reg_val |= EC_RFW_META_L4_OFFSET_SEL;
 2648         else
 2649                 reg_val &= ~EC_RFW_META_L4_OFFSET_SEL;
 2650 
 2651         if (l3_offset_sel == AL_ETH_L3_OFFSET_INNER)
 2652                 reg_val |= EC_RFW_META_L3_OFFSET_SEL;
 2653         else
 2654                 reg_val &= ~EC_RFW_META_L3_OFFSET_SEL;
 2655 
 2656         if (frag_sel == AL_ETH_FRAG_INNER)
 2657                 reg_val |= EC_RFW_META_FRAG_SEL;
 2658         else
 2659                 reg_val &= ~EC_RFW_META_FRAG_SEL;
 2660 
 2661 
 2662         al_reg_write32(&adapter->ec_regs_base->rfw.meta, reg_val);
 2663 }
 2664 
 2665 /**
 2666  * Configure RX header split
 2667  */
 2668 int al_eth_rx_header_split_config(struct al_hal_eth_adapter *adapter, al_bool enable, uint32_t header_len)
 2669 {
 2670         uint32_t        reg;
 2671 
 2672         reg = al_reg_read32(&adapter->ec_regs_base->rfw.hdr_split);
 2673         if (enable == AL_TRUE)
 2674                 reg |= EC_RFW_HDR_SPLIT_EN;
 2675         else
 2676                 reg &= ~EC_RFW_HDR_SPLIT_EN;
 2677 
 2678         AL_REG_FIELD_SET(reg, EC_RFW_HDR_SPLIT_DEF_LEN_MASK, EC_RFW_HDR_SPLIT_DEF_LEN_SHIFT, header_len);
 2679         al_reg_write32(&adapter->ec_regs_base->rfw.hdr_split, reg);
 2680         return 0;
 2681 }
 2682 
 2683 
 2684 /**
 2685  * enable / disable header split in the udma queue.
 2686  * length will be taken from the udma configuration to enable different length per queue.
 2687  */
 2688 int al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter *adapter,
 2689                                         al_bool enable,
 2690                                         uint32_t qid,
 2691                                         uint32_t header_len)
 2692 {
 2693         al_udma_s2m_q_compl_hdr_split_config(&(adapter->rx_udma.udma_q[qid]), enable,
 2694                                              AL_TRUE, header_len);
 2695 
 2696         return 0;
 2697 }
 2698 
 2699 
 2700 /**
 2701  * add buffer to receive queue
 2702  */
 2703 int al_eth_rx_buffer_add(struct al_udma_q *rx_dma_q,
 2704                               struct al_buf *buf, uint32_t flags,
 2705                               struct al_buf *header_buf)
 2706 {
 2707         uint64_t tgtid = ((uint64_t)flags & AL_ETH_RX_FLAGS_TGTID_MASK) <<
 2708                 AL_UDMA_DESC_TGTID_SHIFT;
 2709         uint32_t flags_len = flags & ~AL_ETH_RX_FLAGS_TGTID_MASK;
 2710         union al_udma_desc *rx_desc;
 2711 
 2712         al_dbg("[%s %d]: add rx buffer.\n", rx_dma_q->udma->name, rx_dma_q->qid);
 2713 
 2714 #if 1
 2715         if (unlikely(al_udma_available_get(rx_dma_q) < 1)) {
 2716                 al_dbg("[%s]: rx q (%d) has no enough free descriptor",
 2717                          rx_dma_q->udma->name, rx_dma_q->qid);
 2718                 return -ENOSPC;
 2719         }
 2720 #endif
 2721         rx_desc = al_udma_desc_get(rx_dma_q);
 2722 
 2723         flags_len |= al_udma_ring_id_get(rx_dma_q) << AL_S2M_DESC_RING_ID_SHIFT;
 2724         flags_len |= buf->len & AL_S2M_DESC_LEN_MASK;
 2725 
 2726         if (flags & AL_S2M_DESC_DUAL_BUF) {
 2727                 al_assert(header_buf != NULL); /*header valid in dual buf */
 2728                 al_assert((rx_dma_q->udma->rev_id >= AL_UDMA_REV_ID_2) ||
 2729                         (AL_ADDR_HIGH(buf->addr) == AL_ADDR_HIGH(header_buf->addr)));
 2730 
 2731                 flags_len |= ((header_buf->len >> AL_S2M_DESC_LEN2_GRANULARITY_SHIFT)
 2732                         << AL_S2M_DESC_LEN2_SHIFT) & AL_S2M_DESC_LEN2_MASK;
 2733                 rx_desc->rx.buf2_ptr_lo = swap32_to_le(AL_ADDR_LOW(header_buf->addr));
 2734         }
 2735         rx_desc->rx.len_ctrl = swap32_to_le(flags_len);
 2736         rx_desc->rx.buf1_ptr = swap64_to_le(buf->addr | tgtid);
 2737 
 2738         return 0;
 2739 }
 2740 
 2741 /**
 2742  * notify the hw engine about rx descriptors that were added to the receive queue
 2743  */
 2744 void al_eth_rx_buffer_action(struct al_udma_q *rx_dma_q, uint32_t descs_num)
 2745 {
 2746         al_dbg("[%s]: update the rx engine tail pointer: queue %d. descs %d\n",
 2747                  rx_dma_q->udma->name, rx_dma_q->qid, descs_num);
 2748 
 2749         /* add rx descriptor */
 2750         al_udma_desc_action_add(rx_dma_q, descs_num);
 2751 }
 2752 
 2753 /**
 2754  * get packet from RX completion ring
 2755  */
 2756 uint32_t al_eth_pkt_rx(struct al_udma_q *rx_dma_q,
 2757                               struct al_eth_pkt *pkt)
 2758 {
 2759         volatile union al_udma_cdesc *cdesc;
 2760         volatile al_eth_rx_cdesc *rx_desc;
 2761         uint32_t i;
 2762         uint32_t rc;
 2763 
 2764         rc = al_udma_cdesc_packet_get(rx_dma_q, &cdesc);
 2765         if (rc == 0)
 2766                 return 0;
 2767 
 2768         al_assert(rc <= AL_ETH_PKT_MAX_BUFS);
 2769 
 2770         al_dbg("[%s]: fetch rx packet: queue %d.\n",
 2771                  rx_dma_q->udma->name, rx_dma_q->qid);
 2772 
 2773         pkt->rx_header_len = 0;
 2774         for (i = 0; i < rc; i++) {
 2775                 uint32_t buf1_len, buf2_len;
 2776 
 2777                 /* get next descriptor */
 2778                 rx_desc = (volatile al_eth_rx_cdesc *)al_cdesc_next(rx_dma_q, cdesc, i);
 2779 
 2780                 buf1_len = swap32_from_le(rx_desc->len);
 2781 
 2782                 if ((i == 0) && (swap32_from_le(rx_desc->word2) &
 2783                         AL_UDMA_CDESC_BUF2_USED)) {
 2784                         buf2_len = swap32_from_le(rx_desc->word2);
 2785                         pkt->rx_header_len = (buf2_len & AL_S2M_DESC_LEN2_MASK) >>
 2786                         AL_S2M_DESC_LEN2_SHIFT;
 2787                         }
 2788                 if ((swap32_from_le(rx_desc->ctrl_meta) & AL_UDMA_CDESC_BUF1_USED) &&
 2789                         ((swap32_from_le(rx_desc->ctrl_meta) & AL_UDMA_CDESC_DDP) == 0))
 2790                         pkt->bufs[i].len = buf1_len & AL_S2M_DESC_LEN_MASK;
 2791                 else
 2792                         pkt->bufs[i].len = 0;
 2793         }
 2794         /* get flags from last desc */
 2795         pkt->flags = swap32_from_le(rx_desc->ctrl_meta);
 2796 #ifdef AL_ETH_RX_DESC_RAW_GET
 2797         pkt->rx_desc_raw[0] = pkt->flags;
 2798         pkt->rx_desc_raw[1] = swap32_from_le(rx_desc->len);
 2799         pkt->rx_desc_raw[2] = swap32_from_le(rx_desc->word2);
 2800         pkt->rx_desc_raw[3] = swap32_from_le(rx_desc->word3);
 2801 #endif
 2802         /* update L3/L4 proto index */
 2803         pkt->l3_proto_idx = pkt->flags & AL_ETH_RX_L3_PROTO_IDX_MASK;
 2804         pkt->l4_proto_idx = (pkt->flags >> AL_ETH_RX_L4_PROTO_IDX_SHIFT) &
 2805                                 AL_ETH_RX_L4_PROTO_IDX_MASK;
 2806         pkt->rxhash = (swap32_from_le(rx_desc->len) & AL_ETH_RX_HASH_MASK) >>
 2807                         AL_ETH_RX_HASH_SHIFT;
 2808         pkt->l3_offset = (swap32_from_le(rx_desc->word2) & AL_ETH_RX_L3_OFFSET_MASK) >> AL_ETH_RX_L3_OFFSET_SHIFT;
 2809 
 2810         al_udma_cdesc_ack(rx_dma_q, rc);
 2811         return rc;
 2812 }
 2813 
 2814 
 2815 int al_eth_rx_parser_entry_update(struct al_hal_eth_adapter *adapter, uint32_t idx,
 2816                 struct al_eth_epe_p_reg_entry *reg_entry,
 2817                 struct al_eth_epe_control_entry *control_entry)
 2818 {
 2819         al_eth_epe_entry_set(adapter, idx, reg_entry, control_entry);
 2820         return 0;
 2821 }
 2822 
 2823 #define AL_ETH_THASH_UDMA_SHIFT         0
 2824 #define AL_ETH_THASH_UDMA_MASK          (0xF << AL_ETH_THASH_UDMA_SHIFT)
 2825 
 2826 #define AL_ETH_THASH_Q_SHIFT            4
 2827 #define AL_ETH_THASH_Q_MASK             (0x3 << AL_ETH_THASH_Q_SHIFT)
 2828 
 2829 int al_eth_thash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma, uint32_t queue)
 2830 {
 2831         uint32_t entry;
 2832         al_assert(idx < AL_ETH_RX_THASH_TABLE_SIZE); /*valid THASH index*/
 2833 
 2834         entry = (udma << AL_ETH_THASH_UDMA_SHIFT) & AL_ETH_THASH_UDMA_MASK;
 2835         entry |= (queue << AL_ETH_THASH_Q_SHIFT) & AL_ETH_THASH_Q_MASK;
 2836 
 2837         al_reg_write32(&adapter->ec_regs_base->rfw.thash_table_addr, idx);
 2838         al_reg_write32(&adapter->ec_regs_base->rfw.thash_table_data, entry);
 2839         return 0;
 2840 }
 2841 
 2842 int al_eth_fsm_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry)
 2843 {
 2844 
 2845         al_assert(idx < AL_ETH_RX_FSM_TABLE_SIZE); /*valid FSM index*/
 2846 
 2847 
 2848         al_reg_write32(&adapter->ec_regs_base->rfw.fsm_table_addr, idx);
 2849         al_reg_write32(&adapter->ec_regs_base->rfw.fsm_table_data, entry);
 2850         return 0;
 2851 }
 2852 
 2853 static uint32_t al_eth_fwd_ctrl_entry_to_val(struct al_eth_fwd_ctrl_table_entry *entry)
 2854 {
 2855         uint32_t val = 0;
 2856         AL_REG_FIELD_SET(val,  AL_FIELD_MASK(3,0), 0, entry->prio_sel);
 2857         AL_REG_FIELD_SET(val,  AL_FIELD_MASK(7,4), 4, entry->queue_sel_1);
 2858         AL_REG_FIELD_SET(val,  AL_FIELD_MASK(9,8), 8, entry->queue_sel_2);
 2859         AL_REG_FIELD_SET(val,  AL_FIELD_MASK(13,10), 10, entry->udma_sel);
 2860         AL_REG_FIELD_SET(val,  AL_FIELD_MASK(17,15), 15, entry->hdr_split_len_sel);
 2861         if (entry->hdr_split_len_sel != AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_0)
 2862                 val |= AL_BIT(18);
 2863         AL_REG_BIT_VAL_SET(val, 19, !!(entry->filter == AL_TRUE));
 2864 
 2865         return val;
 2866 }
 2867 
 2868 static int al_eth_ctrl_index_match(struct al_eth_fwd_ctrl_table_index *index, uint32_t i) {
 2869         if ((index->vlan_table_out != AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_ANY)
 2870                 && (index->vlan_table_out != AL_REG_BIT_GET(i, 0)))
 2871                 return 0;
 2872         if ((index->tunnel_exist != AL_ETH_FWD_CTRL_IDX_TUNNEL_ANY)
 2873                 && (index->tunnel_exist != AL_REG_BIT_GET(i, 1)))
 2874                 return 0;
 2875         if ((index->vlan_exist != AL_ETH_FWD_CTRL_IDX_VLAN_ANY)
 2876                 && (index->vlan_exist != AL_REG_BIT_GET(i, 2)))
 2877                 return 0;
 2878         if ((index->mac_table_match != AL_ETH_FWD_CTRL_IDX_MAC_TABLE_ANY)
 2879                 && (index->mac_table_match != AL_REG_BIT_GET(i, 3)))
 2880                 return 0;
 2881         if ((index->protocol_id != AL_ETH_PROTO_ID_ANY)
 2882                 && (index->protocol_id != AL_REG_FIELD_GET(i, AL_FIELD_MASK(8,4),4)))
 2883                 return 0;
 2884         if ((index->mac_type != AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_ANY)
 2885                 && (index->mac_type != AL_REG_FIELD_GET(i, AL_FIELD_MASK(10,9),9)))
 2886                 return 0;
 2887         return 1;
 2888 }
 2889 
 2890 int al_eth_ctrl_table_set(struct al_hal_eth_adapter *adapter,
 2891                           struct al_eth_fwd_ctrl_table_index *index,
 2892                           struct al_eth_fwd_ctrl_table_entry *entry)
 2893 {
 2894         uint32_t val = al_eth_fwd_ctrl_entry_to_val(entry);
 2895         uint32_t i;
 2896 
 2897         for (i = 0; i < AL_ETH_RX_CTRL_TABLE_SIZE; i++) {
 2898                 if (al_eth_ctrl_index_match(index, i)) {
 2899                         al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_addr, i);
 2900                         al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_data, val);
 2901                 }
 2902         }
 2903         return 0;
 2904 }
 2905 
 2906 int al_eth_ctrl_table_def_set(struct al_hal_eth_adapter *adapter,
 2907                               al_bool use_table,
 2908                               struct al_eth_fwd_ctrl_table_entry *entry)
 2909 {
 2910         uint32_t val = al_eth_fwd_ctrl_entry_to_val(entry);
 2911 
 2912         if (use_table)
 2913                 val |= EC_RFW_CTRL_TABLE_DEF_SEL;
 2914 
 2915         al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_def, val);
 2916 
 2917         return 0;
 2918 }
 2919 
 2920 int al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry)
 2921 {
 2922 
 2923         al_assert(idx < AL_ETH_RX_CTRL_TABLE_SIZE); /* valid CTRL index */
 2924 
 2925 
 2926         al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_addr, idx);
 2927         al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_data, entry);
 2928         return 0;
 2929 }
 2930 
 2931 int al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter *adapter, uint32_t val)
 2932 {
 2933         al_reg_write32(&adapter->ec_regs_base->rfw.ctrl_table_def, val);
 2934 
 2935         return 0;
 2936 }
 2937 
 2938 int al_eth_hash_key_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t val)
 2939 {
 2940 
 2941         al_assert(idx < AL_ETH_RX_HASH_KEY_NUM); /*valid CTRL index*/
 2942 
 2943         al_reg_write32(&adapter->ec_regs_base->rfw_hash[idx].key, val);
 2944 
 2945         return 0;
 2946 }
 2947 
 2948 static uint32_t al_eth_fwd_mac_table_entry_to_val(struct al_eth_fwd_mac_table_entry *entry)
 2949 {
 2950         uint32_t val = 0;
 2951 
 2952         val |= (entry->filter == AL_TRUE) ? EC_FWD_MAC_CTRL_RX_VAL_DROP : 0;
 2953         val |= ((entry->udma_mask << EC_FWD_MAC_CTRL_RX_VAL_UDMA_SHIFT) &
 2954                                         EC_FWD_MAC_CTRL_RX_VAL_UDMA_MASK);
 2955 
 2956         val |= ((entry->qid << EC_FWD_MAC_CTRL_RX_VAL_QID_SHIFT) &
 2957                                         EC_FWD_MAC_CTRL_RX_VAL_QID_MASK);
 2958 
 2959         val |= (entry->rx_valid == AL_TRUE) ? EC_FWD_MAC_CTRL_RX_VALID : 0;
 2960 
 2961         val |= ((entry->tx_target << EC_FWD_MAC_CTRL_TX_VAL_SHIFT) &
 2962                                         EC_FWD_MAC_CTRL_TX_VAL_MASK);
 2963 
 2964         val |= (entry->tx_valid == AL_TRUE) ? EC_FWD_MAC_CTRL_TX_VALID : 0;
 2965 
 2966         return val;
 2967 }
 2968 
 2969 int al_eth_fwd_mac_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 2970                              struct al_eth_fwd_mac_table_entry *entry)
 2971 {
 2972         uint32_t val;
 2973 
 2974         al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
 2975 
 2976         val = (entry->addr[2] << 24) | (entry->addr[3] << 16) |
 2977               (entry->addr[4] << 8) | entry->addr[5];
 2978         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_l, val);
 2979         val = (entry->addr[0] << 8) | entry->addr[1];
 2980         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_h, val);
 2981         val = (entry->mask[2] << 24) | (entry->mask[3] << 16) |
 2982               (entry->mask[4] << 8) | entry->mask[5];
 2983         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_l, val);
 2984         val = (entry->mask[0] << 8) | entry->mask[1];
 2985         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_h, val);
 2986 
 2987         val = al_eth_fwd_mac_table_entry_to_val(entry);
 2988         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].ctrl, val);
 2989         return 0;
 2990 }
 2991 
 2992 
 2993 
 2994 int al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t addr_lo, uint32_t addr_hi, uint32_t mask_lo, uint32_t mask_hi)
 2995 {
 2996         al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
 2997 
 2998         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_l, addr_lo);
 2999         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].data_h, addr_hi);
 3000         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_l, mask_lo);
 3001         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].mask_h, mask_hi);
 3002 
 3003         return 0;
 3004 }
 3005 
 3006 int al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t ctrl)
 3007 {
 3008         al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
 3009 
 3010         al_reg_write32(&adapter->ec_regs_base->fwd_mac[idx].ctrl, ctrl);
 3011 
 3012         return 0;
 3013 }
 3014 
 3015 int al_eth_mac_addr_store(void * __iomem ec_base, uint32_t idx, uint8_t *addr)
 3016 {
 3017         struct al_ec_regs __iomem *ec_regs_base = (struct al_ec_regs __iomem*)ec_base;
 3018         uint32_t val;
 3019 
 3020         al_assert(idx < AL_ETH_FWD_MAC_NUM); /*valid FWD MAC index */
 3021 
 3022         val = (addr[2] << 24) | (addr[3] << 16) | (addr[4] << 8) | addr[5];
 3023         al_reg_write32(&ec_regs_base->fwd_mac[idx].data_l, val);
 3024         val = (addr[0] << 8) | addr[1];
 3025         al_reg_write32(&ec_regs_base->fwd_mac[idx].data_h, val);
 3026         return 0;
 3027 }
 3028 
 3029 int al_eth_mac_addr_read(void * __iomem ec_base, uint32_t idx, uint8_t *addr)
 3030 {
 3031         struct al_ec_regs __iomem *ec_regs_base = (struct al_ec_regs __iomem*)ec_base;
 3032         uint32_t addr_lo = al_reg_read32(&ec_regs_base->fwd_mac[idx].data_l);
 3033         uint16_t addr_hi = al_reg_read32(&ec_regs_base->fwd_mac[idx].data_h);
 3034 
 3035         addr[5] = addr_lo & 0xff;
 3036         addr[4] = (addr_lo >> 8) & 0xff;
 3037         addr[3] = (addr_lo >> 16) & 0xff;
 3038         addr[2] = (addr_lo >> 24) & 0xff;
 3039         addr[1] = addr_hi & 0xff;
 3040         addr[0] = (addr_hi >> 8) & 0xff;
 3041         return 0;
 3042 }
 3043 
 3044 int al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, uint8_t qid)
 3045 {
 3046         uint32_t val = 0;
 3047         al_assert(idx < AL_ETH_FWD_MAC_HASH_NUM); /* valid MHASH index */
 3048 
 3049         AL_REG_FIELD_SET(val,  AL_FIELD_MASK(3,0), 0, udma_mask);
 3050         AL_REG_FIELD_SET(val,  AL_FIELD_MASK(5,4), 4, qid);
 3051 
 3052         al_reg_write32(&adapter->ec_regs_base->rfw.mhash_table_addr, idx);
 3053         al_reg_write32(&adapter->ec_regs_base->rfw.mhash_table_data, val);
 3054         return 0;
 3055 }
 3056 static uint32_t al_eth_fwd_vid_entry_to_val(struct al_eth_fwd_vid_table_entry *entry)
 3057 {
 3058         uint32_t val = 0;
 3059         AL_REG_BIT_VAL_SET(val, 0, entry->control);
 3060         AL_REG_BIT_VAL_SET(val, 1, entry->filter);
 3061         AL_REG_FIELD_SET(val, AL_FIELD_MASK(5,2), 2, entry->udma_mask);
 3062 
 3063         return val;
 3064 }
 3065 
 3066 int al_eth_fwd_vid_config_set(struct al_hal_eth_adapter *adapter, al_bool use_table,
 3067                               struct al_eth_fwd_vid_table_entry *default_entry,
 3068                               uint32_t default_vlan)
 3069 {
 3070         uint32_t reg;
 3071 
 3072         reg = al_eth_fwd_vid_entry_to_val(default_entry);
 3073         if (use_table)
 3074                 reg |= EC_RFW_VID_TABLE_DEF_SEL;
 3075         else
 3076                 reg &= ~EC_RFW_VID_TABLE_DEF_SEL;
 3077         al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_def, reg);
 3078         al_reg_write32(&adapter->ec_regs_base->rfw.default_vlan, default_vlan);
 3079 
 3080         return 0;
 3081 }
 3082 
 3083 int al_eth_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 3084                              struct al_eth_fwd_vid_table_entry *entry)
 3085 {
 3086         uint32_t val;
 3087         al_assert(idx < AL_ETH_FWD_VID_TABLE_NUM); /* valid VID index */
 3088 
 3089         val = al_eth_fwd_vid_entry_to_val(entry);
 3090         al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_addr, idx);
 3091         al_reg_write32(&adapter->ec_regs_base->rfw.vid_table_data, val);
 3092         return 0;
 3093 }
 3094 
 3095 int al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
 3096 {
 3097 
 3098         al_assert(idx < AL_ETH_FWD_PBITS_TABLE_NUM); /* valid PBIT index */
 3099         al_assert(prio < AL_ETH_FWD_PRIO_TABLE_NUM); /* valid PRIO index */
 3100         al_reg_write32(&adapter->ec_regs_base->rfw.pbits_table_addr, idx);
 3101         al_reg_write32(&adapter->ec_regs_base->rfw.pbits_table_data, prio);
 3102         return 0;
 3103 }
 3104 
 3105 int al_eth_fwd_priority_table_set(struct al_hal_eth_adapter *adapter, uint8_t prio, uint8_t qid)
 3106 {
 3107         al_assert(prio < AL_ETH_FWD_PRIO_TABLE_NUM); /* valid PRIO index */
 3108 
 3109         al_reg_write32(&adapter->ec_regs_base->rfw_priority[prio].queue, qid);
 3110         return 0;
 3111 }
 3112 
 3113 
 3114 int al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
 3115 {
 3116 
 3117         al_assert(idx < AL_ETH_FWD_DSCP_TABLE_NUM); /* valid DSCP index */
 3118 
 3119 
 3120         al_reg_write32(&adapter->ec_regs_base->rfw.dscp_table_addr, idx);
 3121         al_reg_write32(&adapter->ec_regs_base->rfw.dscp_table_data, prio);
 3122         return 0;
 3123 }
 3124 
 3125 int al_eth_fwd_tc_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio)
 3126 {
 3127 
 3128         al_assert(idx < AL_ETH_FWD_TC_TABLE_NUM); /* valid TC index */
 3129 
 3130 
 3131         al_reg_write32(&adapter->ec_regs_base->rfw.tc_table_addr, idx);
 3132         al_reg_write32(&adapter->ec_regs_base->rfw.tc_table_data, prio);
 3133         return 0;
 3134 }
 3135 
 3136 /** Configure default UDMA register */
 3137 int al_eth_fwd_default_udma_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
 3138                                    uint8_t udma_mask)
 3139 {
 3140         al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
 3141                                EC_RFW_DEFAULT_OPT_1_UDMA_MASK,
 3142                                udma_mask << EC_RFW_DEFAULT_OPT_1_UDMA_SHIFT);
 3143         return 0;
 3144 }
 3145 
 3146 /** Configure default queue register */
 3147 int al_eth_fwd_default_queue_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
 3148                                    uint8_t qid)
 3149 {
 3150         al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
 3151                                EC_RFW_DEFAULT_OPT_1_QUEUE_MASK,
 3152                                qid << EC_RFW_DEFAULT_OPT_1_QUEUE_SHIFT);
 3153         return 0;
 3154 }
 3155 
 3156 /** Configure default priority register */
 3157 int al_eth_fwd_default_priority_config(struct al_hal_eth_adapter *adapter, uint32_t idx,
 3158                                    uint8_t prio)
 3159 {
 3160         al_reg_write32_masked(&adapter->ec_regs_base->rfw_default[idx].opt_1,
 3161                                EC_RFW_DEFAULT_OPT_1_PRIORITY_MASK,
 3162                                prio << EC_RFW_DEFAULT_OPT_1_PRIORITY_SHIFT);
 3163         return 0;
 3164 }
 3165 
 3166 int al_eth_switching_config_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t forward_all_to_mac, uint8_t enable_int_switching,
 3167                                         enum al_eth_tx_switch_vid_sel_type vid_sel_type,
 3168                                         enum al_eth_tx_switch_dec_type uc_dec,
 3169                                         enum al_eth_tx_switch_dec_type mc_dec,
 3170                                         enum al_eth_tx_switch_dec_type bc_dec)
 3171 {
 3172         uint32_t reg;
 3173 
 3174         if (udma_id == 0) {
 3175                 reg = al_reg_read32(&adapter->ec_regs_base->tfw.tx_gen);
 3176                 if (forward_all_to_mac)
 3177                         reg |= EC_TFW_TX_GEN_FWD_ALL_TO_MAC;
 3178                 else
 3179                         reg &= ~EC_TFW_TX_GEN_FWD_ALL_TO_MAC;
 3180                 al_reg_write32(&adapter->ec_regs_base->tfw.tx_gen, reg);
 3181         }
 3182 
 3183         reg = enable_int_switching;
 3184         reg |= (vid_sel_type & 7) << 1;
 3185         reg |= (bc_dec & 3) << 4;
 3186         reg |= (mc_dec & 3) << 6;
 3187         reg |= (uc_dec & 3) << 8;
 3188         al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].fwd_dec, reg);
 3189 
 3190         return 0;
 3191 }
 3192 
 3193 #define AL_ETH_RFW_FILTER_SUPPORTED(rev_id)     \
 3194         (AL_ETH_RFW_FILTER_UNDET_MAC | \
 3195         AL_ETH_RFW_FILTER_DET_MAC | \
 3196         AL_ETH_RFW_FILTER_TAGGED | \
 3197         AL_ETH_RFW_FILTER_UNTAGGED | \
 3198         AL_ETH_RFW_FILTER_BC | \
 3199         AL_ETH_RFW_FILTER_MC | \
 3200         AL_ETH_RFW_FILTER_VLAN_VID | \
 3201         AL_ETH_RFW_FILTER_CTRL_TABLE | \
 3202         AL_ETH_RFW_FILTER_PROT_INDEX | \
 3203         AL_ETH_RFW_FILTER_WOL | \
 3204         AL_ETH_RFW_FILTER_PARSE)
 3205 
 3206 /* Configure the receive filters */
 3207 int al_eth_filter_config(struct al_hal_eth_adapter *adapter, struct al_eth_filter_params *params)
 3208 {
 3209         uint32_t reg;
 3210 
 3211         al_assert(params); /* valid params pointer */
 3212 
 3213         if (params->filters & ~(AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id))) {
 3214                 al_err("[%s]: unsupported filter options (0x%08x)\n", adapter->name, params->filters);
 3215                 return -EINVAL;
 3216         }
 3217 
 3218         reg = al_reg_read32(&adapter->ec_regs_base->rfw.out_cfg);
 3219         if (params->enable == AL_TRUE)
 3220                 AL_REG_MASK_SET(reg, EC_RFW_OUT_CFG_DROP_EN);
 3221         else
 3222                 AL_REG_MASK_CLEAR(reg, EC_RFW_OUT_CFG_DROP_EN);
 3223         al_reg_write32(&adapter->ec_regs_base->rfw.out_cfg, reg);
 3224 
 3225         al_reg_write32_masked(
 3226                 &adapter->ec_regs_base->rfw.filter,
 3227                 AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id),
 3228                 params->filters);
 3229         if (params->filters & AL_ETH_RFW_FILTER_PROT_INDEX) {
 3230                 int i;
 3231                 for (i = 0; i < AL_ETH_PROTOCOLS_NUM; i++) {
 3232                         reg = al_reg_read32(&adapter->ec_regs_base->epe_a[i].prot_act);
 3233                         if (params->filter_proto[i] == AL_TRUE)
 3234                                 AL_REG_MASK_SET(reg, EC_EPE_A_PROT_ACT_DROP);
 3235                         else
 3236                                 AL_REG_MASK_CLEAR(reg, EC_EPE_A_PROT_ACT_DROP);
 3237                         al_reg_write32(&adapter->ec_regs_base->epe_a[i].prot_act, reg);
 3238                 }
 3239         }
 3240         return 0;
 3241 }
 3242 
 3243 /* Configure the receive override filters */
 3244 int al_eth_filter_override_config(struct al_hal_eth_adapter *adapter,
 3245                                   struct al_eth_filter_override_params *params)
 3246 {
 3247         uint32_t reg;
 3248 
 3249         al_assert(params); /* valid params pointer */
 3250 
 3251         if (params->filters & ~(AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id))) {
 3252                 al_err("[%s]: unsupported override filter options (0x%08x)\n", adapter->name, params->filters);
 3253                 return -EINVAL;
 3254         }
 3255 
 3256         al_reg_write32_masked(
 3257                 &adapter->ec_regs_base->rfw.filter,
 3258                 AL_ETH_RFW_FILTER_SUPPORTED(adapter->rev_id) << 16,
 3259                 params->filters << 16);
 3260 
 3261         reg = al_reg_read32(&adapter->ec_regs_base->rfw.default_or);
 3262         AL_REG_FIELD_SET(reg, EC_RFW_DEFAULT_OR_UDMA_MASK, EC_RFW_DEFAULT_OR_UDMA_SHIFT, params->udma);
 3263         AL_REG_FIELD_SET(reg, EC_RFW_DEFAULT_OR_QUEUE_MASK, EC_RFW_DEFAULT_OR_QUEUE_SHIFT, params->qid);
 3264         al_reg_write32(&adapter->ec_regs_base->rfw.default_or, reg);
 3265         return 0;
 3266 }
 3267 
 3268 
 3269 
 3270 int al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t udma_uc_bitmask,
 3271                                                 uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask)
 3272 {
 3273         al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].uc_udma, udma_uc_bitmask);
 3274         al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].mc_udma, udma_mc_bitmask);
 3275         al_reg_write32(&adapter->ec_regs_base->tfw_udma[udma_id].bc_udma, udma_bc_bitmask);
 3276 
 3277         return 0;
 3278 }
 3279 
 3280 int al_eth_flow_control_config(struct al_hal_eth_adapter *adapter, struct al_eth_flow_control_params *params)
 3281 {
 3282         uint32_t reg;
 3283         int i;
 3284         al_assert(params); /* valid params pointer */
 3285 
 3286         switch(params->type){
 3287         case AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE:
 3288                 al_dbg("[%s]: config flow control to link pause mode.\n", adapter->name);
 3289 
 3290                 /* config the mac */
 3291                 if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
 3292                         /* set quanta value */
 3293                         al_reg_write32(
 3294                                 &adapter->mac_regs_base->mac_1g.pause_quant,
 3295                                 params->quanta);
 3296                         al_reg_write32(
 3297                                 &adapter->ec_regs_base->efc.xoff_timer_1g,
 3298                                 params->quanta_th);
 3299 
 3300                 } else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
 3301                         /* set quanta value */
 3302                         al_reg_write32(
 3303                                 &adapter->mac_regs_base->mac_10g.cl01_pause_quanta,
 3304                                 params->quanta);
 3305                         /* set quanta threshold value */
 3306                         al_reg_write32(
 3307                                 &adapter->mac_regs_base->mac_10g.cl01_quanta_thresh,
 3308                                 params->quanta_th);
 3309                 } else {
 3310                         /* set quanta value */
 3311                         al_eth_40g_mac_reg_write(adapter,
 3312                                 ETH_MAC_GEN_V3_MAC_40G_CL01_PAUSE_QUANTA_ADDR,
 3313                                 params->quanta);
 3314                         /* set quanta threshold value */
 3315                         al_eth_40g_mac_reg_write(adapter,
 3316                                 ETH_MAC_GEN_V3_MAC_40G_CL01_QUANTA_THRESH_ADDR,
 3317                                 params->quanta_th);
 3318                 }
 3319 
 3320                 if (params->obay_enable == AL_TRUE)
 3321                         /* Tx path FIFO, unmask pause_on from MAC when PAUSE packet received */
 3322                         al_reg_write32(&adapter->ec_regs_base->efc.ec_pause, 1);
 3323                 else
 3324                         al_reg_write32(&adapter->ec_regs_base->efc.ec_pause, 0);
 3325 
 3326 
 3327                 /* Rx path */
 3328                 if (params->gen_enable == AL_TRUE)
 3329                         /* enable generating xoff from ec fifo almost full indication in hysteresis mode */
 3330                         al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 1 << EC_EFC_EC_XOFF_MASK_2_SHIFT);
 3331                 else
 3332                         al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0);
 3333 
 3334                 if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
 3335                         /* in 1G mode, enable generating xon from ec fifo in hysteresis mode*/
 3336                         al_reg_write32(&adapter->ec_regs_base->efc.xon, EC_EFC_XON_MASK_2 | EC_EFC_XON_MASK_1);
 3337 
 3338                 /* set hysteresis mode thresholds */
 3339                 al_reg_write32(&adapter->ec_regs_base->efc.rx_fifo_hyst, params->rx_fifo_th_low | (params->rx_fifo_th_high << EC_EFC_RX_FIFO_HYST_TH_HIGH_SHIFT));
 3340 
 3341                 for (i = 0; i < 4; i++) {
 3342                         if (params->obay_enable == AL_TRUE)
 3343                                 /* Tx path UDMA, unmask pause_on for all queues */
 3344                                 al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0,
 3345                                                 params->prio_q_map[i][0]);
 3346                         else
 3347                                 al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0, 0);
 3348 
 3349                         if (params->gen_enable == AL_TRUE)
 3350                                 /* Rx path UDMA, enable generating xoff from UDMA queue almost full indication */
 3351                                 al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0, params->prio_q_map[i][0]);
 3352                         else
 3353                                 al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0, 0);
 3354                 }
 3355         break;
 3356         case AL_ETH_FLOW_CONTROL_TYPE_PFC:
 3357                 al_dbg("[%s]: config flow control to PFC mode.\n", adapter->name);
 3358                 al_assert(!AL_ETH_IS_1G_MAC(adapter->mac_mode)); /* pfc not available for RGMII mode */;
 3359 
 3360                 for (i = 0; i < 4; i++) {
 3361                         int prio;
 3362                         for (prio = 0; prio < 8; prio++) {
 3363                                 if (params->obay_enable == AL_TRUE)
 3364                                         /* Tx path UDMA, unmask pause_on for all queues */
 3365                                         al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0 + prio,
 3366                                                         params->prio_q_map[i][prio]);
 3367                                 else
 3368                                         al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_pause_0 + prio,
 3369                                                         0);
 3370 
 3371                                 if (params->gen_enable == AL_TRUE)
 3372                                         al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0 + prio,
 3373                                                         params->prio_q_map[i][prio]);
 3374                                 else
 3375                                         al_reg_write32(&adapter->ec_regs_base->fc_udma[i].q_xoff_0 + prio,
 3376                                                         0);
 3377                         }
 3378                 }
 3379 
 3380                 /* Rx path */
 3381                 /* enable generating xoff from ec fifo almost full indication in hysteresis mode */
 3382                 if (params->gen_enable == AL_TRUE)
 3383                         al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0xFF << EC_EFC_EC_XOFF_MASK_2_SHIFT);
 3384                 else
 3385                         al_reg_write32(&adapter->ec_regs_base->efc.ec_xoff, 0);
 3386 
 3387                 /* set hysteresis mode thresholds */
 3388                 al_reg_write32(&adapter->ec_regs_base->efc.rx_fifo_hyst, params->rx_fifo_th_low | (params->rx_fifo_th_high << EC_EFC_RX_FIFO_HYST_TH_HIGH_SHIFT));
 3389 
 3390                 if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
 3391                         /* config the 10g_mac */
 3392                         /* set quanta value (same value for all prios) */
 3393                         reg = params->quanta | (params->quanta << 16);
 3394                         al_reg_write32(
 3395                                 &adapter->mac_regs_base->mac_10g.cl01_pause_quanta, reg);
 3396                         al_reg_write32(
 3397                                 &adapter->mac_regs_base->mac_10g.cl23_pause_quanta, reg);
 3398                         al_reg_write32(
 3399                                 &adapter->mac_regs_base->mac_10g.cl45_pause_quanta, reg);
 3400                         al_reg_write32(
 3401                                 &adapter->mac_regs_base->mac_10g.cl67_pause_quanta, reg);
 3402                         /* set quanta threshold value (same value for all prios) */
 3403                         reg = params->quanta_th | (params->quanta_th << 16);
 3404                         al_reg_write32(
 3405                                 &adapter->mac_regs_base->mac_10g.cl01_quanta_thresh, reg);
 3406                         al_reg_write32(
 3407                                 &adapter->mac_regs_base->mac_10g.cl23_quanta_thresh, reg);
 3408                         al_reg_write32(
 3409                                 &adapter->mac_regs_base->mac_10g.cl45_quanta_thresh, reg);
 3410                         al_reg_write32(
 3411                                 &adapter->mac_regs_base->mac_10g.cl67_quanta_thresh, reg);
 3412 
 3413                         /* enable PFC in the 10g_MAC */
 3414                         reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.cmd_cfg);
 3415                         reg |= 1 << 19;
 3416                         al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, reg);
 3417                 } else {
 3418                         /* config the 40g_mac */
 3419                         /* set quanta value (same value for all prios) */
 3420                         reg = params->quanta | (params->quanta << 16);
 3421                         al_eth_40g_mac_reg_write(adapter,
 3422                                 ETH_MAC_GEN_V3_MAC_40G_CL01_PAUSE_QUANTA_ADDR, reg);
 3423                         al_eth_40g_mac_reg_write(adapter,
 3424                                 ETH_MAC_GEN_V3_MAC_40G_CL23_PAUSE_QUANTA_ADDR, reg);
 3425                         al_eth_40g_mac_reg_write(adapter,
 3426                                 ETH_MAC_GEN_V3_MAC_40G_CL45_PAUSE_QUANTA_ADDR, reg);
 3427                         al_eth_40g_mac_reg_write(adapter,
 3428                                 ETH_MAC_GEN_V3_MAC_40G_CL67_PAUSE_QUANTA_ADDR, reg);
 3429                         /* set quanta threshold value (same value for all prios) */
 3430                         reg = params->quanta_th | (params->quanta_th << 16);
 3431                         al_eth_40g_mac_reg_write(adapter,
 3432                                 ETH_MAC_GEN_V3_MAC_40G_CL01_QUANTA_THRESH_ADDR, reg);
 3433                         al_eth_40g_mac_reg_write(adapter,
 3434                                 ETH_MAC_GEN_V3_MAC_40G_CL23_QUANTA_THRESH_ADDR, reg);
 3435                         al_eth_40g_mac_reg_write(adapter,
 3436                                 ETH_MAC_GEN_V3_MAC_40G_CL45_QUANTA_THRESH_ADDR, reg);
 3437                         al_eth_40g_mac_reg_write(adapter,
 3438                                 ETH_MAC_GEN_V3_MAC_40G_CL67_QUANTA_THRESH_ADDR, reg);
 3439 
 3440                         /* enable PFC in the 40g_MAC */
 3441                         reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.cmd_cfg);
 3442                         reg |= 1 << 19;
 3443                         al_reg_write32(&adapter->mac_regs_base->mac_10g.cmd_cfg, reg);
 3444                         reg = al_eth_40g_mac_reg_read(adapter, ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR);
 3445 
 3446                         reg |= ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_PFC_MODE;
 3447 
 3448                         al_eth_40g_mac_reg_write(adapter, ETH_MAC_GEN_V3_MAC_40G_COMMAND_CONFIG_ADDR, reg);
 3449                 }
 3450 
 3451         break;
 3452         default:
 3453                 al_err("[%s]: unsupported flow control type %d\n", adapter->name, params->type);
 3454                 return -EINVAL;
 3455 
 3456         }
 3457         return 0;
 3458 }
 3459 
 3460 int al_eth_vlan_mod_config(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint16_t udma_etype, uint16_t vlan1_data, uint16_t vlan2_data)
 3461 {
 3462         al_dbg("[%s]: config vlan modification registers. udma id %d.\n", adapter->name, udma_id);
 3463 
 3464         al_reg_write32(&adapter->ec_regs_base->tpm_sel[udma_id].etype, udma_etype);
 3465         al_reg_write32(&adapter->ec_regs_base->tpm_udma[udma_id].vlan_data, vlan1_data | (vlan2_data << 16));
 3466 
 3467         return 0;
 3468 }
 3469 
 3470 int al_eth_eee_get(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params)
 3471 {
 3472         uint32_t reg;
 3473 
 3474         al_dbg("[%s]: getting eee.\n", adapter->name);
 3475 
 3476         reg = al_reg_read32(&adapter->ec_regs_base->eee.cfg_e);
 3477         params->enable = (reg & EC_EEE_CFG_E_ENABLE) ? AL_TRUE : AL_FALSE;
 3478 
 3479         params->tx_eee_timer = al_reg_read32(&adapter->ec_regs_base->eee.pre_cnt);
 3480         params->min_interval = al_reg_read32(&adapter->ec_regs_base->eee.post_cnt);
 3481         params->stop_cnt = al_reg_read32(&adapter->ec_regs_base->eee.stop_cnt);
 3482 
 3483         return 0;
 3484 }
 3485 
 3486 
 3487 int al_eth_eee_config(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params)
 3488 {
 3489         uint32_t reg;
 3490         al_dbg("[%s]: config eee.\n", adapter->name);
 3491 
 3492         if (params->enable == 0) {
 3493                 al_dbg("[%s]: disable eee.\n", adapter->name);
 3494                 al_reg_write32(&adapter->ec_regs_base->eee.cfg_e, 0);
 3495                 return 0;
 3496         }
 3497         if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
 3498                 al_reg_write32_masked(
 3499                         &adapter->mac_regs_base->kr.pcs_cfg,
 3500                         ETH_MAC_KR_PCS_CFG_EEE_TIMER_VAL_MASK,
 3501                         ((AL_ETH_IS_10G_MAC(adapter->mac_mode)) ?
 3502                         ETH_MAC_KR_10_PCS_CFG_EEE_TIMER_VAL :
 3503                         ETH_MAC_KR_25_PCS_CFG_EEE_TIMER_VAL) <<
 3504                         ETH_MAC_KR_PCS_CFG_EEE_TIMER_VAL_SHIFT);
 3505         }
 3506         if ((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ||
 3507                 (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
 3508                 al_reg_write32_masked(
 3509                         &adapter->mac_regs_base->gen_v3.pcs_40g_ll_eee_cfg,
 3510                         ETH_MAC_GEN_V3_PCS_40G_LL_EEE_CFG_TIMER_VAL_MASK,
 3511                         ((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ?
 3512                         ETH_MAC_XLG_40_PCS_CFG_EEE_TIMER_VAL :
 3513                         ETH_MAC_XLG_50_PCS_CFG_EEE_TIMER_VAL) <<
 3514                         ETH_MAC_GEN_V3_PCS_40G_LL_EEE_CFG_TIMER_VAL_SHIFT);
 3515                 /* set Deep sleep mode as the LPI function (instead of Fast wake mode) */
 3516                 al_eth_40g_pcs_reg_write(adapter, ETH_MAC_GEN_V3_PCS_40G_EEE_CONTROL_ADDR,
 3517                         params->fast_wake ? 1 : 0);
 3518         }
 3519 
 3520         al_reg_write32(&adapter->ec_regs_base->eee.pre_cnt, params->tx_eee_timer);
 3521         al_reg_write32(&adapter->ec_regs_base->eee.post_cnt, params->min_interval);
 3522         al_reg_write32(&adapter->ec_regs_base->eee.stop_cnt, params->stop_cnt);
 3523 
 3524         reg = EC_EEE_CFG_E_MASK_EC_TMI_STOP | EC_EEE_CFG_E_MASK_MAC_EEE |
 3525                EC_EEE_CFG_E_ENABLE |
 3526                EC_EEE_CFG_E_USE_EC_TX_FIFO | EC_EEE_CFG_E_USE_EC_RX_FIFO;
 3527 
 3528         /*
 3529          * Addressing RMN: 3732
 3530          *
 3531          * RMN description:
 3532          * When the HW get into eee mode, it can't transmit any pause packet
 3533          * (when flow control policy is enabled).
 3534          * In such case, the HW has no way to handle extreme pushback from
 3535          * the Rx_path fifos.
 3536          *
 3537          * Software flow:
 3538          * Configure RX_FIFO empty as eee mode term.
 3539          * That way, nothing will prevent pause packet transmittion in
 3540          * case of extreme pushback from the Rx_path fifos.
 3541          *
 3542          */
 3543 
 3544         al_reg_write32(&adapter->ec_regs_base->eee.cfg_e, reg);
 3545 
 3546         return 0;
 3547 }
 3548 
 3549 /* Timestamp */
 3550 /* prepare the adapter for doing Timestamps for Rx packets. */
 3551 int al_eth_ts_init(struct al_hal_eth_adapter *adapter)
 3552 {
 3553         uint32_t reg;
 3554 
 3555         /*TODO:
 3556          * return error when:
 3557          * - working in 1G mode and MACSEC enabled
 3558          * - RX completion descriptor is not 8 words
 3559          */
 3560         reg = al_reg_read32(&adapter->ec_regs_base->gen.en_ext);
 3561         if (AL_ETH_IS_1G_MAC(adapter->mac_mode))
 3562                 reg &= ~EC_GEN_EN_EXT_PTH_1_10_SEL;
 3563         else
 3564                 reg |= EC_GEN_EN_EXT_PTH_1_10_SEL;
 3565         /*
 3566          * set completion bypass so tx timestamps won't be inserted to tx cmpl
 3567          * (in order to disable unverified flow)
 3568          */
 3569         reg |= EC_GEN_EN_EXT_PTH_COMPLETION_BYPASS;
 3570         al_reg_write32(&adapter->ec_regs_base->gen.en_ext, reg);
 3571 
 3572         /*TODO: add the following when we have updated regs file:
 3573          * reg_rfw_out_cfg_timestamp_sample_out
 3574                 0 (default) – use the timestamp from the SOP info (10G MAC)
 3575                 1 – use the timestamp from the EOP (1G MAC) (noly when MACSEC is disabled)
 3576          */
 3577         return 0;
 3578 }
 3579 
 3580 /* read Timestamp sample value of previously transmitted packet. */
 3581 int al_eth_tx_ts_val_get(struct al_hal_eth_adapter *adapter, uint8_t ts_index,
 3582                          uint32_t *timestamp)
 3583 {
 3584         al_assert(ts_index < AL_ETH_PTH_TX_SAMPLES_NUM);
 3585 
 3586         /* in 1G mode, only indexes 1-7 are allowed*/
 3587         if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
 3588                 al_assert(ts_index <= 7);
 3589                 al_assert(ts_index >= 1);
 3590         }
 3591 
 3592         /*TODO: check if sample is valid */
 3593         *timestamp = al_reg_read32(&adapter->ec_regs_base->pth_db[ts_index].ts);
 3594         return 0;
 3595 }
 3596 
 3597 /* Read the systime value */
 3598 int al_eth_pth_systime_read(struct al_hal_eth_adapter *adapter,
 3599                             struct al_eth_pth_time *systime)
 3600 {
 3601         uint32_t reg;
 3602 
 3603         /* first we must read the subseconds MSB so the seconds register will be
 3604          * shadowed
 3605          */
 3606         reg = al_reg_read32(&adapter->ec_regs_base->pth.system_time_subseconds_msb);
 3607         systime->femto = (uint64_t)reg << 18;
 3608         reg = al_reg_read32(&adapter->ec_regs_base->pth.system_time_seconds);
 3609         systime->seconds = reg;
 3610 
 3611         return 0;
 3612 }
 3613 
 3614 /* Set the clock period to a given value. */
 3615 int al_eth_pth_clk_period_write(struct al_hal_eth_adapter *adapter,
 3616                                 uint64_t clk_period)
 3617 {
 3618         uint32_t reg;
 3619         /* first write the LSB so it will be shadowed */
 3620         /* bits 31:14 of the clock period lsb register contains bits 17:0 of the
 3621          * period.
 3622          */
 3623         reg = (clk_period & AL_BIT_MASK(18)) << EC_PTH_CLOCK_PERIOD_LSB_VAL_SHIFT;
 3624         al_reg_write32(&adapter->ec_regs_base->pth.clock_period_lsb, reg);
 3625         reg = clk_period >> 18;
 3626         al_reg_write32(&adapter->ec_regs_base->pth.clock_period_msb, reg);
 3627 
 3628         return 0;
 3629 }
 3630 
 3631 /* Configure the systime internal update */
 3632 int al_eth_pth_int_update_config(struct al_hal_eth_adapter *adapter,
 3633                                  struct al_eth_pth_int_update_params *params)
 3634 {
 3635         uint32_t reg;
 3636 
 3637         reg = al_reg_read32(&adapter->ec_regs_base->pth.int_update_ctrl);
 3638         if (params->enable == AL_FALSE) {
 3639                 reg &= ~EC_PTH_INT_UPDATE_CTRL_INT_TRIG_EN;
 3640         } else {
 3641                 reg |= EC_PTH_INT_UPDATE_CTRL_INT_TRIG_EN;
 3642                 AL_REG_FIELD_SET(reg, EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_MASK,
 3643                                  EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_SHIFT,
 3644                                  params->method);
 3645                 if (params->trigger == AL_ETH_PTH_INT_TRIG_REG_WRITE)
 3646                         reg |= EC_PTH_INT_UPDATE_CTRL_UPDATE_TRIG;
 3647                 else
 3648                         reg &= ~EC_PTH_INT_UPDATE_CTRL_UPDATE_TRIG;
 3649         }
 3650         al_reg_write32(&adapter->ec_regs_base->pth.int_update_ctrl, reg);
 3651         return 0;
 3652 }
 3653 /* set internal update time */
 3654 int al_eth_pth_int_update_time_set(struct al_hal_eth_adapter *adapter,
 3655                                    struct al_eth_pth_time *time)
 3656 {
 3657         uint32_t reg;
 3658 
 3659         al_reg_write32(&adapter->ec_regs_base->pth.int_update_seconds,
 3660                        time->seconds);
 3661         reg = time->femto & AL_BIT_MASK(18);
 3662         reg = reg << EC_PTH_INT_UPDATE_SUBSECONDS_LSB_VAL_SHIFT;
 3663         al_reg_write32(&adapter->ec_regs_base->pth.int_update_subseconds_lsb,
 3664                        reg);
 3665         reg = time->femto >> 18;
 3666         al_reg_write32(&adapter->ec_regs_base->pth.int_update_subseconds_msb,
 3667                        reg);
 3668 
 3669         return 0;
 3670 }
 3671 
 3672 /* Configure the systime external update */
 3673 int al_eth_pth_ext_update_config(struct al_hal_eth_adapter *adapter,
 3674                                  struct al_eth_pth_ext_update_params * params)
 3675 {
 3676         uint32_t reg;
 3677 
 3678         reg = al_reg_read32(&adapter->ec_regs_base->pth.int_update_ctrl);
 3679         AL_REG_FIELD_SET(reg, EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_MASK,
 3680                          EC_PTH_INT_UPDATE_CTRL_UPDATE_METHOD_SHIFT,
 3681                          params->method);
 3682 
 3683         AL_REG_FIELD_SET(reg, EC_PTH_EXT_UPDATE_CTRL_EXT_TRIG_EN_MASK,
 3684                          EC_PTH_EXT_UPDATE_CTRL_EXT_TRIG_EN_SHIFT,
 3685                          params->triggers);
 3686         al_reg_write32(&adapter->ec_regs_base->pth.int_update_ctrl, reg);
 3687         return 0;
 3688 }
 3689 
 3690 /* set external update time */
 3691 int al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter *adapter,
 3692                                    struct al_eth_pth_time *time)
 3693 {
 3694         uint32_t reg;
 3695 
 3696         al_reg_write32(&adapter->ec_regs_base->pth.ext_update_seconds,
 3697                        time->seconds);
 3698         reg = time->femto & AL_BIT_MASK(18);
 3699         reg = reg << EC_PTH_EXT_UPDATE_SUBSECONDS_LSB_VAL_SHIFT;
 3700         al_reg_write32(&adapter->ec_regs_base->pth.ext_update_subseconds_lsb,
 3701                        reg);
 3702         reg = time->femto >> 18;
 3703         al_reg_write32(&adapter->ec_regs_base->pth.ext_update_subseconds_msb,
 3704                        reg);
 3705 
 3706         return 0;
 3707 };
 3708 
 3709 /* set the read compensation delay */
 3710 int al_eth_pth_read_compensation_set(struct al_hal_eth_adapter *adapter,
 3711                                      uint64_t subseconds)
 3712 {
 3713         uint32_t reg;
 3714 
 3715         /* first write to lsb to ensure atomicity */
 3716         reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_READ_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
 3717         al_reg_write32(&adapter->ec_regs_base->pth.read_compensation_subseconds_lsb, reg);
 3718 
 3719         reg = subseconds >> 18;
 3720         al_reg_write32(&adapter->ec_regs_base->pth.read_compensation_subseconds_msb, reg);
 3721         return 0;
 3722 }
 3723 
 3724 /* set the internal write compensation delay */
 3725 int al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter *adapter,
 3726                                           uint64_t subseconds)
 3727 {
 3728         uint32_t reg;
 3729 
 3730         /* first write to lsb to ensure atomicity */
 3731         reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_INT_WRITE_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
 3732         al_reg_write32(&adapter->ec_regs_base->pth.int_write_compensation_subseconds_lsb, reg);
 3733 
 3734         reg = subseconds >> 18;
 3735         al_reg_write32(&adapter->ec_regs_base->pth.int_write_compensation_subseconds_msb, reg);
 3736         return 0;
 3737 }
 3738 
 3739 /* set the external write compensation delay */
 3740 int al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter *adapter,
 3741                                           uint64_t subseconds)
 3742 {
 3743         uint32_t reg;
 3744 
 3745         /* first write to lsb to ensure atomicity */
 3746         reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_EXT_WRITE_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
 3747         al_reg_write32(&adapter->ec_regs_base->pth.ext_write_compensation_subseconds_lsb, reg);
 3748 
 3749         reg = subseconds >> 18;
 3750         al_reg_write32(&adapter->ec_regs_base->pth.ext_write_compensation_subseconds_msb, reg);
 3751         return 0;
 3752 }
 3753 
 3754 /* set the sync compensation delay */
 3755 int al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter *adapter,
 3756                                      uint64_t subseconds)
 3757 {
 3758         uint32_t reg;
 3759 
 3760         /* first write to lsb to ensure atomicity */
 3761         reg = (subseconds & AL_BIT_MASK(18)) << EC_PTH_SYNC_COMPENSATION_SUBSECONDS_LSB_VAL_SHIFT;
 3762         al_reg_write32(&adapter->ec_regs_base->pth.sync_compensation_subseconds_lsb, reg);
 3763 
 3764         reg = subseconds >> 18;
 3765         al_reg_write32(&adapter->ec_regs_base->pth.sync_compensation_subseconds_msb, reg);
 3766         return 0;
 3767 }
 3768 
 3769 /* Configure an output pulse */
 3770 int al_eth_pth_pulse_out_config(struct al_hal_eth_adapter *adapter,
 3771                                 struct al_eth_pth_pulse_out_params *params)
 3772 {
 3773         uint32_t reg;
 3774 
 3775         if (params->index >= AL_ETH_PTH_PULSE_OUT_NUM) {
 3776                 al_err("eth [%s] PTH out pulse index out of range\n",
 3777                                  adapter->name);
 3778                 return -EINVAL;
 3779         }
 3780         reg = al_reg_read32(&adapter->ec_regs_base->pth_egress[params->index].trigger_ctrl);
 3781         if (params->enable == AL_FALSE) {
 3782                 reg &= ~EC_PTH_EGRESS_TRIGGER_CTRL_EN;
 3783         } else {
 3784                 reg |= EC_PTH_EGRESS_TRIGGER_CTRL_EN;
 3785                 if (params->periodic == AL_FALSE)
 3786                         reg &= ~EC_PTH_EGRESS_TRIGGER_CTRL_PERIODIC;
 3787                 else
 3788                         reg |= EC_PTH_EGRESS_TRIGGER_CTRL_PERIODIC;
 3789 
 3790                 AL_REG_FIELD_SET(reg, EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SUBSEC_MASK,
 3791                                  EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SUBSEC_SHIFT,
 3792                                  params->period_us);
 3793                 AL_REG_FIELD_SET(reg, EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SEC_MASK,
 3794                                  EC_PTH_EGRESS_TRIGGER_CTRL_PERIOD_SEC_SHIFT,
 3795                                  params->period_sec);
 3796         }
 3797         al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_ctrl, reg);
 3798 
 3799         /* set trigger time */
 3800         al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_seconds,
 3801                        params->start_time.seconds);
 3802         reg = params->start_time.femto & AL_BIT_MASK(18);
 3803         reg = reg << EC_PTH_EGRESS_TRIGGER_SUBSECONDS_LSB_VAL_SHIFT;
 3804         al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_subseconds_lsb,
 3805                        reg);
 3806         reg = params->start_time.femto >> 18;
 3807         al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].trigger_subseconds_msb,
 3808                        reg);
 3809 
 3810         /* set pulse width */
 3811         reg = params->pulse_width & AL_BIT_MASK(18);
 3812         reg = reg << EC_PTH_EGRESS_PULSE_WIDTH_SUBSECONDS_LSB_VAL_SHIFT;
 3813         al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].pulse_width_subseconds_lsb, reg);
 3814 
 3815         reg = params->pulse_width  >> 18;
 3816         al_reg_write32(&adapter->ec_regs_base->pth_egress[params->index].pulse_width_subseconds_msb, reg);
 3817 
 3818         return 0;
 3819 }
 3820 
 3821 /** get link status */
 3822 int al_eth_link_status_get(struct al_hal_eth_adapter *adapter,
 3823                            struct al_eth_link_status *status)
 3824 {
 3825         uint32_t reg;
 3826 
 3827         if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
 3828                 status->link_up = AL_FALSE;
 3829                 status->local_fault = AL_TRUE;
 3830                 status->remote_fault = AL_TRUE;
 3831 
 3832                 al_reg_write32(&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_BASE_R_STATUS2);
 3833                 reg = al_reg_read32(&adapter->mac_regs_base->kr.pcs_data);
 3834 
 3835                 if (reg & AL_BIT(15)) {
 3836                         reg = al_reg_read32(&adapter->mac_regs_base->mac_10g.status);
 3837 
 3838                         status->remote_fault = ((reg & ETH_MAC_GEN_MAC_10G_STAT_REM_FAULT) ?
 3839                                                         AL_TRUE : AL_FALSE);
 3840                         status->local_fault = ((reg & ETH_MAC_GEN_MAC_10G_STAT_LOC_FAULT) ?
 3841                                                         AL_TRUE : AL_FALSE);
 3842 
 3843                         status->link_up = ((status->remote_fault == AL_FALSE) &&
 3844                                            (status->local_fault == AL_FALSE));
 3845                 }
 3846 
 3847         } else if (adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) {
 3848                 al_reg_write32(&adapter->mac_regs_base->sgmii.reg_addr, 1);
 3849                 /*
 3850                  * This register is latched low so need to read twice to get
 3851                  * the current link status
 3852                  */
 3853                 reg = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
 3854                 reg = al_reg_read32(&adapter->mac_regs_base->sgmii.reg_data);
 3855 
 3856                 status->link_up = AL_FALSE;
 3857 
 3858                 if (reg & AL_BIT(2))
 3859                         status->link_up = AL_TRUE;
 3860 
 3861                 reg = al_reg_read32(&adapter->mac_regs_base->sgmii.link_stat);
 3862 
 3863                 if ((reg & AL_BIT(3)) == 0)
 3864                         status->link_up = AL_FALSE;
 3865 
 3866         } else if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
 3867                 reg = al_reg_read32(&adapter->mac_regs_base->gen.rgmii_stat);
 3868 
 3869                 status->link_up = AL_FALSE;
 3870 
 3871                 if (reg & AL_BIT(4))
 3872                         status->link_up = AL_TRUE;
 3873 
 3874         } else if (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_25G) {
 3875                 status->link_up = AL_FALSE;
 3876                 status->local_fault = AL_TRUE;
 3877                 status->remote_fault = AL_TRUE;
 3878 
 3879                 reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_status);
 3880 
 3881                 status->link_up = AL_FALSE;
 3882 
 3883                 if ((reg & 0xF) == 0xF) {
 3884                         reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_status);
 3885 
 3886                         status->remote_fault = ((reg & ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_REM_FAULT) ?
 3887                                                         AL_TRUE : AL_FALSE);
 3888                         status->local_fault = ((reg & ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_LOC_FAULT) ?
 3889                                                         AL_TRUE : AL_FALSE);
 3890 
 3891                         status->link_up = ((status->remote_fault == AL_FALSE) &&
 3892                                            (status->local_fault == AL_FALSE));
 3893                 }
 3894 
 3895         } else if ((adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_40G) ||
 3896                         (adapter->mac_mode == AL_ETH_MAC_MODE_XLG_LL_50G)) {
 3897                 reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.pcs_40g_ll_status);
 3898 
 3899                 status->link_up = AL_FALSE;
 3900 
 3901                 if ((reg & 0x1F) == 0x1F) {
 3902                         reg = al_reg_read32(&adapter->mac_regs_base->gen_v3.mac_40g_ll_status);
 3903                         if ((reg & (ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_REM_FAULT |
 3904                                         ETH_MAC_GEN_V3_MAC_40G_LL_STATUS_LOC_FAULT)) == 0)
 3905                                 status->link_up = AL_TRUE;
 3906                 }
 3907 
 3908         } else {
 3909                 /* not implemented yet */
 3910                 return -EPERM;
 3911         }
 3912 
 3913         al_dbg("[%s]: mac %s port. link_status: %s.\n", adapter->name,
 3914                 al_eth_mac_mode_str(adapter->mac_mode),
 3915                 (status->link_up == AL_TRUE) ? "LINK_UP" : "LINK_DOWN");
 3916 
 3917         return 0;
 3918 }
 3919 
 3920 int al_eth_link_status_clear(struct al_hal_eth_adapter *adapter)
 3921 {
 3922         int status = 0;
 3923 
 3924         if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
 3925                 al_reg_write32(&adapter->mac_regs_base->kr.pcs_addr, ETH_MAC_KR_PCS_BASE_R_STATUS2);
 3926                 al_reg_read32(&adapter->mac_regs_base->kr.pcs_data);
 3927 
 3928                 al_reg_read32(&adapter->mac_regs_base->mac_10g.status);
 3929         } else {
 3930                 status = -1;
 3931         }
 3932 
 3933         return status;
 3934 }
 3935 
 3936 /** set LED mode and value */
 3937 int al_eth_led_set(struct al_hal_eth_adapter *adapter, al_bool link_is_up)
 3938 {
 3939         uint32_t reg = 0;
 3940         uint32_t mode  = ETH_MAC_GEN_LED_CFG_SEL_DEFAULT_REG;
 3941 
 3942         if (link_is_up)
 3943                 mode = ETH_MAC_GEN_LED_CFG_SEL_LINK_ACTIVITY;
 3944 
 3945         AL_REG_FIELD_SET(reg,  ETH_MAC_GEN_LED_CFG_SEL_MASK,
 3946                          ETH_MAC_GEN_LED_CFG_SEL_SHIFT, mode);
 3947 
 3948         AL_REG_FIELD_SET(reg, ETH_MAC_GEN_LED_CFG_BLINK_TIMER_MASK,
 3949                          ETH_MAC_GEN_LED_CFG_BLINK_TIMER_SHIFT,
 3950                          ETH_MAC_GEN_LED_CFG_BLINK_TIMER_VAL);
 3951 
 3952         AL_REG_FIELD_SET(reg, ETH_MAC_GEN_LED_CFG_ACT_TIMER_MASK,
 3953                          ETH_MAC_GEN_LED_CFG_ACT_TIMER_SHIFT,
 3954                          ETH_MAC_GEN_LED_CFG_ACT_TIMER_VAL);
 3955 
 3956         al_reg_write32(&adapter->mac_regs_base->gen.led_cfg, reg);
 3957 
 3958         return 0;
 3959 }
 3960 
 3961 /* get statistics */
 3962 int al_eth_mac_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_mac_stats *stats)
 3963 {
 3964         al_assert(stats);
 3965 
 3966         al_memset(stats, 0, sizeof(struct al_eth_mac_stats));
 3967 
 3968         if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
 3969                 struct al_eth_mac_1g_stats __iomem *reg_stats =
 3970                         &adapter->mac_regs_base->mac_1g.stats;
 3971 
 3972                 stats->ifInUcastPkts = al_reg_read32(&reg_stats->ifInUcastPkts);
 3973                 stats->ifInMulticastPkts = al_reg_read32(&reg_stats->ifInMulticastPkts);
 3974                 stats->ifInBroadcastPkts = al_reg_read32(&reg_stats->ifInBroadcastPkts);
 3975                 stats->etherStatsPkts = al_reg_read32(&reg_stats->etherStatsPkts);
 3976                 stats->ifOutUcastPkts = al_reg_read32(&reg_stats->ifOutUcastPkts);
 3977                 stats->ifOutMulticastPkts = al_reg_read32(&reg_stats->ifOutMulticastPkts);
 3978                 stats->ifOutBroadcastPkts = al_reg_read32(&reg_stats->ifOutBroadcastPkts);
 3979                 stats->ifInErrors = al_reg_read32(&reg_stats->ifInErrors);
 3980                 stats->ifOutErrors = al_reg_read32(&reg_stats->ifOutErrors);
 3981                 stats->aFramesReceivedOK = al_reg_read32(&reg_stats->aFramesReceivedOK);
 3982                 stats->aFramesTransmittedOK = al_reg_read32(&reg_stats->aFramesTransmittedOK);
 3983                 stats->aOctetsReceivedOK = al_reg_read32(&reg_stats->aOctetsReceivedOK);
 3984                 stats->aOctetsTransmittedOK = al_reg_read32(&reg_stats->aOctetsTransmittedOK);
 3985                 stats->etherStatsUndersizePkts = al_reg_read32(&reg_stats->etherStatsUndersizePkts);
 3986                 stats->etherStatsFragments = al_reg_read32(&reg_stats->etherStatsFragments);
 3987                 stats->etherStatsJabbers = al_reg_read32(&reg_stats->etherStatsJabbers);
 3988                 stats->etherStatsOversizePkts = al_reg_read32(&reg_stats->etherStatsOversizePkts);
 3989                 stats->aFrameCheckSequenceErrors =
 3990                         al_reg_read32(&reg_stats->aFrameCheckSequenceErrors);
 3991                 stats->aAlignmentErrors = al_reg_read32(&reg_stats->aAlignmentErrors);
 3992                 stats->etherStatsDropEvents = al_reg_read32(&reg_stats->etherStatsDropEvents);
 3993                 stats->aPAUSEMACCtrlFramesTransmitted =
 3994                         al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesTransmitted);
 3995                 stats->aPAUSEMACCtrlFramesReceived =
 3996                         al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesReceived);
 3997                 stats->aFrameTooLongErrors = 0; /* N/A */
 3998                 stats->aInRangeLengthErrors = 0; /* N/A */
 3999                 stats->VLANTransmittedOK = 0; /* N/A */
 4000                 stats->VLANReceivedOK = 0; /* N/A */
 4001                 stats->etherStatsOctets = al_reg_read32(&reg_stats->etherStatsOctets);
 4002                 stats->etherStatsPkts64Octets = al_reg_read32(&reg_stats->etherStatsPkts64Octets);
 4003                 stats->etherStatsPkts65to127Octets =
 4004                         al_reg_read32(&reg_stats->etherStatsPkts65to127Octets);
 4005                 stats->etherStatsPkts128to255Octets =
 4006                         al_reg_read32(&reg_stats->etherStatsPkts128to255Octets);
 4007                 stats->etherStatsPkts256to511Octets =
 4008                         al_reg_read32(&reg_stats->etherStatsPkts256to511Octets);
 4009                 stats->etherStatsPkts512to1023Octets =
 4010                         al_reg_read32(&reg_stats->etherStatsPkts512to1023Octets);
 4011                 stats->etherStatsPkts1024to1518Octets =
 4012                         al_reg_read32(&reg_stats->etherStatsPkts1024to1518Octets);
 4013                 stats->etherStatsPkts1519toX = al_reg_read32(&reg_stats->etherStatsPkts1519toX);
 4014         } else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
 4015                 if (adapter->rev_id < AL_ETH_REV_ID_3) {
 4016                         struct al_eth_mac_10g_stats_v2 __iomem *reg_stats =
 4017                                 &adapter->mac_regs_base->mac_10g.stats.v2;
 4018                         uint64_t octets;
 4019 
 4020                         stats->ifInUcastPkts = al_reg_read32(&reg_stats->ifInUcastPkts);
 4021                         stats->ifInMulticastPkts = al_reg_read32(&reg_stats->ifInMulticastPkts);
 4022                         stats->ifInBroadcastPkts = al_reg_read32(&reg_stats->ifInBroadcastPkts);
 4023                         stats->etherStatsPkts = al_reg_read32(&reg_stats->etherStatsPkts);
 4024                         stats->ifOutUcastPkts = al_reg_read32(&reg_stats->ifOutUcastPkts);
 4025                         stats->ifOutMulticastPkts = al_reg_read32(&reg_stats->ifOutMulticastPkts);
 4026                         stats->ifOutBroadcastPkts = al_reg_read32(&reg_stats->ifOutBroadcastPkts);
 4027                         stats->ifInErrors = al_reg_read32(&reg_stats->ifInErrors);
 4028                         stats->ifOutErrors = al_reg_read32(&reg_stats->ifOutErrors);
 4029                         stats->aFramesReceivedOK = al_reg_read32(&reg_stats->aFramesReceivedOK);
 4030                         stats->aFramesTransmittedOK = al_reg_read32(&reg_stats->aFramesTransmittedOK);
 4031 
 4032                         /* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
 4033                         octets = al_reg_read32(&reg_stats->ifInOctetsL);
 4034                         octets |= (uint64_t)(al_reg_read32(&reg_stats->ifInOctetsH)) << 32;
 4035                         octets -= 18 * stats->aFramesReceivedOK;
 4036                         octets -= 4 * al_reg_read32(&reg_stats->VLANReceivedOK);
 4037                         stats->aOctetsReceivedOK = octets;
 4038 
 4039                         /* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
 4040                         octets = al_reg_read32(&reg_stats->ifOutOctetsL);
 4041                         octets |= (uint64_t)(al_reg_read32(&reg_stats->ifOutOctetsH)) << 32;
 4042                         octets -= 18 * stats->aFramesTransmittedOK;
 4043                         octets -= 4 * al_reg_read32(&reg_stats->VLANTransmittedOK);
 4044                         stats->aOctetsTransmittedOK = octets;
 4045 
 4046                         stats->etherStatsUndersizePkts = al_reg_read32(&reg_stats->etherStatsUndersizePkts);
 4047                         stats->etherStatsFragments = al_reg_read32(&reg_stats->etherStatsFragments);
 4048                         stats->etherStatsJabbers = al_reg_read32(&reg_stats->etherStatsJabbers);
 4049                         stats->etherStatsOversizePkts = al_reg_read32(&reg_stats->etherStatsOversizePkts);
 4050                         stats->aFrameCheckSequenceErrors = al_reg_read32(&reg_stats->aFrameCheckSequenceErrors);
 4051                         stats->aAlignmentErrors = al_reg_read32(&reg_stats->aAlignmentErrors);
 4052                         stats->etherStatsDropEvents = al_reg_read32(&reg_stats->etherStatsDropEvents);
 4053                         stats->aPAUSEMACCtrlFramesTransmitted = al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesTransmitted);
 4054                         stats->aPAUSEMACCtrlFramesReceived = al_reg_read32(&reg_stats->aPAUSEMACCtrlFramesReceived);
 4055                         stats->aFrameTooLongErrors = al_reg_read32(&reg_stats->aFrameTooLongErrors);
 4056                         stats->aInRangeLengthErrors = al_reg_read32(&reg_stats->aInRangeLengthErrors);
 4057                         stats->VLANTransmittedOK = al_reg_read32(&reg_stats->VLANTransmittedOK);
 4058                         stats->VLANReceivedOK = al_reg_read32(&reg_stats->VLANReceivedOK);
 4059                         stats->etherStatsOctets = al_reg_read32(&reg_stats->etherStatsOctets);
 4060                         stats->etherStatsPkts64Octets = al_reg_read32(&reg_stats->etherStatsPkts64Octets);
 4061                         stats->etherStatsPkts65to127Octets = al_reg_read32(&reg_stats->etherStatsPkts65to127Octets);
 4062                         stats->etherStatsPkts128to255Octets = al_reg_read32(&reg_stats->etherStatsPkts128to255Octets);
 4063                         stats->etherStatsPkts256to511Octets = al_reg_read32(&reg_stats->etherStatsPkts256to511Octets);
 4064                         stats->etherStatsPkts512to1023Octets = al_reg_read32(&reg_stats->etherStatsPkts512to1023Octets);
 4065                         stats->etherStatsPkts1024to1518Octets = al_reg_read32(&reg_stats->etherStatsPkts1024to1518Octets);
 4066                         stats->etherStatsPkts1519toX = al_reg_read32(&reg_stats->etherStatsPkts1519toX);
 4067                 } else {
 4068                         struct al_eth_mac_10g_stats_v3_rx __iomem *reg_rx_stats =
 4069                                 &adapter->mac_regs_base->mac_10g.stats.v3.rx;
 4070                         struct al_eth_mac_10g_stats_v3_tx __iomem *reg_tx_stats =
 4071                                 &adapter->mac_regs_base->mac_10g.stats.v3.tx;
 4072                         uint64_t octets;
 4073 
 4074                         stats->ifInUcastPkts = al_reg_read32(&reg_rx_stats->ifInUcastPkts);
 4075                         stats->ifInMulticastPkts = al_reg_read32(&reg_rx_stats->ifInMulticastPkts);
 4076                         stats->ifInBroadcastPkts = al_reg_read32(&reg_rx_stats->ifInBroadcastPkts);
 4077                         stats->etherStatsPkts = al_reg_read32(&reg_rx_stats->etherStatsPkts);
 4078                         stats->ifOutUcastPkts = al_reg_read32(&reg_tx_stats->ifUcastPkts);
 4079                         stats->ifOutMulticastPkts = al_reg_read32(&reg_tx_stats->ifMulticastPkts);
 4080                         stats->ifOutBroadcastPkts = al_reg_read32(&reg_tx_stats->ifBroadcastPkts);
 4081                         stats->ifInErrors = al_reg_read32(&reg_rx_stats->ifInErrors);
 4082                         stats->ifOutErrors = al_reg_read32(&reg_tx_stats->ifOutErrors);
 4083                         stats->aFramesReceivedOK = al_reg_read32(&reg_rx_stats->FramesOK);
 4084                         stats->aFramesTransmittedOK = al_reg_read32(&reg_tx_stats->FramesOK);
 4085 
 4086                         /* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
 4087                         octets = al_reg_read32(&reg_rx_stats->ifOctetsL);
 4088                         octets |= (uint64_t)(al_reg_read32(&reg_rx_stats->ifOctetsH)) << 32;
 4089                         octets -= 18 * stats->aFramesReceivedOK;
 4090                         octets -= 4 * al_reg_read32(&reg_rx_stats->VLANOK);
 4091                         stats->aOctetsReceivedOK = octets;
 4092 
 4093                         /* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
 4094                         octets = al_reg_read32(&reg_tx_stats->ifOctetsL);
 4095                         octets |= (uint64_t)(al_reg_read32(&reg_tx_stats->ifOctetsH)) << 32;
 4096                         octets -= 18 * stats->aFramesTransmittedOK;
 4097                         octets -= 4 * al_reg_read32(&reg_tx_stats->VLANOK);
 4098                         stats->aOctetsTransmittedOK = octets;
 4099 
 4100                         stats->etherStatsUndersizePkts = al_reg_read32(&reg_rx_stats->etherStatsUndersizePkts);
 4101                         stats->etherStatsFragments = al_reg_read32(&reg_rx_stats->etherStatsFragments);
 4102                         stats->etherStatsJabbers = al_reg_read32(&reg_rx_stats->etherStatsJabbers);
 4103                         stats->etherStatsOversizePkts = al_reg_read32(&reg_rx_stats->etherStatsOversizePkts);
 4104                         stats->aFrameCheckSequenceErrors = al_reg_read32(&reg_rx_stats->CRCErrors);
 4105                         stats->aAlignmentErrors = al_reg_read32(&reg_rx_stats->aAlignmentErrors);
 4106                         stats->etherStatsDropEvents = al_reg_read32(&reg_rx_stats->etherStatsDropEvents);
 4107                         stats->aPAUSEMACCtrlFramesTransmitted = al_reg_read32(&reg_tx_stats->aPAUSEMACCtrlFrames);
 4108                         stats->aPAUSEMACCtrlFramesReceived = al_reg_read32(&reg_rx_stats->aPAUSEMACCtrlFrames);
 4109                         stats->aFrameTooLongErrors = al_reg_read32(&reg_rx_stats->aFrameTooLong);
 4110                         stats->aInRangeLengthErrors = al_reg_read32(&reg_rx_stats->aInRangeLengthErrors);
 4111                         stats->VLANTransmittedOK = al_reg_read32(&reg_tx_stats->VLANOK);
 4112                         stats->VLANReceivedOK = al_reg_read32(&reg_rx_stats->VLANOK);
 4113                         stats->etherStatsOctets = al_reg_read32(&reg_rx_stats->etherStatsOctets);
 4114                         stats->etherStatsPkts64Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts64Octets);
 4115                         stats->etherStatsPkts65to127Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts65to127Octets);
 4116                         stats->etherStatsPkts128to255Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts128to255Octets);
 4117                         stats->etherStatsPkts256to511Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts256to511Octets);
 4118                         stats->etherStatsPkts512to1023Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts512to1023Octets);
 4119                         stats->etherStatsPkts1024to1518Octets = al_reg_read32(&reg_rx_stats->etherStatsPkts1024to1518Octets);
 4120                         stats->etherStatsPkts1519toX = al_reg_read32(&reg_rx_stats->etherStatsPkts1519toMax);
 4121                 }
 4122         } else {
 4123                 struct al_eth_mac_10g_stats_v3_rx __iomem *reg_rx_stats =
 4124                         &adapter->mac_regs_base->mac_10g.stats.v3.rx;
 4125                 struct al_eth_mac_10g_stats_v3_tx __iomem *reg_tx_stats =
 4126                         &adapter->mac_regs_base->mac_10g.stats.v3.tx;
 4127                 uint64_t octets;
 4128 
 4129                 /* 40G MAC statistics registers are the same, only read indirectly */
 4130                 #define _40g_mac_reg_read32(field)      al_eth_40g_mac_reg_read(adapter,        \
 4131                         ((uint8_t *)(field)) - ((uint8_t *)&adapter->mac_regs_base->mac_10g))
 4132 
 4133                 stats->ifInUcastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInUcastPkts);
 4134                 stats->ifInMulticastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInMulticastPkts);
 4135                 stats->ifInBroadcastPkts = _40g_mac_reg_read32(&reg_rx_stats->ifInBroadcastPkts);
 4136                 stats->etherStatsPkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts);
 4137                 stats->ifOutUcastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifUcastPkts);
 4138                 stats->ifOutMulticastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifMulticastPkts);
 4139                 stats->ifOutBroadcastPkts = _40g_mac_reg_read32(&reg_tx_stats->ifBroadcastPkts);
 4140                 stats->ifInErrors = _40g_mac_reg_read32(&reg_rx_stats->ifInErrors);
 4141                 stats->ifOutErrors = _40g_mac_reg_read32(&reg_tx_stats->ifOutErrors);
 4142                 stats->aFramesReceivedOK = _40g_mac_reg_read32(&reg_rx_stats->FramesOK);
 4143                 stats->aFramesTransmittedOK = _40g_mac_reg_read32(&reg_tx_stats->FramesOK);
 4144 
 4145                 /* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
 4146                 octets = _40g_mac_reg_read32(&reg_rx_stats->ifOctetsL);
 4147                 octets |= (uint64_t)(_40g_mac_reg_read32(&reg_rx_stats->ifOctetsH)) << 32;
 4148                 octets -= 18 * stats->aFramesReceivedOK;
 4149                 octets -= 4 * _40g_mac_reg_read32(&reg_rx_stats->VLANOK);
 4150                 stats->aOctetsReceivedOK = octets;
 4151 
 4152                 /* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
 4153                 octets = _40g_mac_reg_read32(&reg_tx_stats->ifOctetsL);
 4154                 octets |= (uint64_t)(_40g_mac_reg_read32(&reg_tx_stats->ifOctetsH)) << 32;
 4155                 octets -= 18 * stats->aFramesTransmittedOK;
 4156                 octets -= 4 * _40g_mac_reg_read32(&reg_tx_stats->VLANOK);
 4157                 stats->aOctetsTransmittedOK = octets;
 4158 
 4159                 stats->etherStatsUndersizePkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsUndersizePkts);
 4160                 stats->etherStatsFragments = _40g_mac_reg_read32(&reg_rx_stats->etherStatsFragments);
 4161                 stats->etherStatsJabbers = _40g_mac_reg_read32(&reg_rx_stats->etherStatsJabbers);
 4162                 stats->etherStatsOversizePkts = _40g_mac_reg_read32(&reg_rx_stats->etherStatsOversizePkts);
 4163                 stats->aFrameCheckSequenceErrors = _40g_mac_reg_read32(&reg_rx_stats->CRCErrors);
 4164                 stats->aAlignmentErrors = _40g_mac_reg_read32(&reg_rx_stats->aAlignmentErrors);
 4165                 stats->etherStatsDropEvents = _40g_mac_reg_read32(&reg_rx_stats->etherStatsDropEvents);
 4166                 stats->aPAUSEMACCtrlFramesTransmitted = _40g_mac_reg_read32(&reg_tx_stats->aPAUSEMACCtrlFrames);
 4167                 stats->aPAUSEMACCtrlFramesReceived = _40g_mac_reg_read32(&reg_rx_stats->aPAUSEMACCtrlFrames);
 4168                 stats->aFrameTooLongErrors = _40g_mac_reg_read32(&reg_rx_stats->aFrameTooLong);
 4169                 stats->aInRangeLengthErrors = _40g_mac_reg_read32(&reg_rx_stats->aInRangeLengthErrors);
 4170                 stats->VLANTransmittedOK = _40g_mac_reg_read32(&reg_tx_stats->VLANOK);
 4171                 stats->VLANReceivedOK = _40g_mac_reg_read32(&reg_rx_stats->VLANOK);
 4172                 stats->etherStatsOctets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsOctets);
 4173                 stats->etherStatsPkts64Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts64Octets);
 4174                 stats->etherStatsPkts65to127Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts65to127Octets);
 4175                 stats->etherStatsPkts128to255Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts128to255Octets);
 4176                 stats->etherStatsPkts256to511Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts256to511Octets);
 4177                 stats->etherStatsPkts512to1023Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts512to1023Octets);
 4178                 stats->etherStatsPkts1024to1518Octets = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts1024to1518Octets);
 4179                 stats->etherStatsPkts1519toX = _40g_mac_reg_read32(&reg_rx_stats->etherStatsPkts1519toMax);
 4180         }
 4181 
 4182         stats->eee_in = al_reg_read32(&adapter->mac_regs_base->stat.eee_in);
 4183         stats->eee_out = al_reg_read32(&adapter->mac_regs_base->stat.eee_out);
 4184 
 4185 /*      stats->etherStatsPkts = 1; */
 4186         return 0;
 4187 }
 4188 
 4189 /**
 4190 * read ec_stat_counters
 4191 */
 4192 int al_eth_ec_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_ec_stats *stats)
 4193 {
 4194         al_assert(stats);
 4195         stats->faf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_pkt);
 4196         stats->faf_in_rx_short = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_short);
 4197         stats->faf_in_rx_long = al_reg_read32(&adapter->ec_regs_base->stat.faf_in_rx_long);
 4198         stats->faf_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_pkt);
 4199         stats->faf_out_rx_short = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_short);
 4200         stats->faf_out_rx_long = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_rx_long);
 4201         stats->faf_out_drop = al_reg_read32(&adapter->ec_regs_base->stat.faf_out_drop);
 4202         stats->rxf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_in_rx_pkt);
 4203         stats->rxf_in_fifo_err = al_reg_read32(&adapter->ec_regs_base->stat.rxf_in_fifo_err);
 4204         stats->lbf_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.lbf_in_rx_pkt);
 4205         stats->lbf_in_fifo_err = al_reg_read32(&adapter->ec_regs_base->stat.lbf_in_fifo_err);
 4206         stats->rxf_out_rx_1_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_rx_1_pkt);
 4207         stats->rxf_out_rx_2_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_rx_2_pkt);
 4208         stats->rxf_out_drop_1_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_drop_1_pkt);
 4209         stats->rxf_out_drop_2_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rxf_out_drop_2_pkt);
 4210         stats->rpe_1_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_1_in_rx_pkt);
 4211         stats->rpe_1_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_1_out_rx_pkt);
 4212         stats->rpe_2_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_2_in_rx_pkt);
 4213         stats->rpe_2_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_2_out_rx_pkt);
 4214         stats->rpe_3_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_3_in_rx_pkt);
 4215         stats->rpe_3_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rpe_3_out_rx_pkt);
 4216         stats->tpe_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpe_in_tx_pkt);
 4217         stats->tpe_out_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpe_out_tx_pkt);
 4218         stats->tpm_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tpm_tx_pkt);
 4219         stats->tfw_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tfw_in_tx_pkt);
 4220         stats->tfw_out_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.tfw_out_tx_pkt);
 4221         stats->rfw_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_rx_pkt);
 4222         stats->rfw_in_vlan_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_drop);
 4223         stats->rfw_in_parse_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_parse_drop);
 4224         stats->rfw_in_mc = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mc);
 4225         stats->rfw_in_bc = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_bc);
 4226         stats->rfw_in_vlan_exist = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_exist);
 4227         stats->rfw_in_vlan_nexist = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_vlan_nexist);
 4228         stats->rfw_in_mac_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mac_drop);
 4229         stats->rfw_in_mac_ndet_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_mac_ndet_drop);
 4230         stats->rfw_in_ctrl_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_ctrl_drop);
 4231         stats->rfw_in_prot_i_drop = al_reg_read32(&adapter->ec_regs_base->stat.rfw_in_prot_i_drop);
 4232         stats->eee_in = al_reg_read32(&adapter->ec_regs_base->stat.eee_in);
 4233         return 0;
 4234 }
 4235 
 4236 /**
 4237  * read per_udma_counters
 4238  */
 4239 int al_eth_ec_stat_udma_get(struct al_hal_eth_adapter *adapter, uint8_t idx, struct al_eth_ec_stat_udma *stats)
 4240 {
 4241 
 4242         al_assert(idx <= 3); /*valid udma_id*/
 4243         al_assert(stats);
 4244         stats->rfw_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].rfw_out_rx_pkt);
 4245         stats->rfw_out_drop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].rfw_out_drop);
 4246         stats->msw_in_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_in_rx_pkt);
 4247         stats->msw_drop_q_full = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_q_full);
 4248         stats->msw_drop_sop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_sop);
 4249         stats->msw_drop_eop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_drop_eop);
 4250         stats->msw_wr_eop = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_wr_eop);
 4251         stats->msw_out_rx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].msw_out_rx_pkt);
 4252         stats->tso_no_tso_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_no_tso_pkt);
 4253         stats->tso_tso_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_tso_pkt);
 4254         stats->tso_seg_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_seg_pkt);
 4255         stats->tso_pad_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tso_pad_pkt);
 4256         stats->tpm_tx_spoof = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tpm_tx_spoof);
 4257         stats->tmi_in_tx_pkt = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_in_tx_pkt);
 4258         stats->tmi_out_to_mac = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_out_to_mac);
 4259         stats->tmi_out_to_rx = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tmi_out_to_rx);
 4260         stats->tx_q0_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q0_bytes);
 4261         stats->tx_q1_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q1_bytes);
 4262         stats->tx_q2_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q2_bytes);
 4263         stats->tx_q3_bytes = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q3_bytes);
 4264         stats->tx_q0_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q0_pkts);
 4265         stats->tx_q1_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q1_pkts);
 4266         stats->tx_q2_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q2_pkts);
 4267         stats->tx_q3_pkts = al_reg_read32(&adapter->ec_regs_base->stat_udma[idx].tx_q3_pkts);
 4268         return 0;
 4269 }
 4270 
 4271 /* Traffic control */
 4272 
 4273 
 4274 int al_eth_flr_rmn(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
 4275                    int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
 4276                    void *handle,
 4277                    void __iomem *mac_base)
 4278 {
 4279         struct al_eth_mac_regs __iomem *mac_regs_base =
 4280                 (struct al_eth_mac_regs __iomem *)mac_base;
 4281         uint32_t cfg_reg_store[6];
 4282         uint32_t reg;
 4283         uint32_t mux_sel;
 4284         int i = 0;
 4285 
 4286         (*pci_read_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, &reg);
 4287 
 4288         /* reset 1G mac */
 4289         AL_REG_MASK_SET(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
 4290         (*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
 4291         al_udelay(1000);
 4292         /* don't reset 1G mac */
 4293         AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
 4294         /* prevent 1G mac reset on FLR */
 4295         AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC_ON_FLR);
 4296         /* prevent adapter reset */
 4297         (*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
 4298 
 4299         mux_sel = al_reg_read32(&mac_regs_base->gen.mux_sel);
 4300 
 4301         /* save pci register that get reset due to flr*/
 4302         (*pci_read_config_u32)(handle, AL_PCI_COMMAND, &cfg_reg_store[i++]);
 4303         (*pci_read_config_u32)(handle, 0xC, &cfg_reg_store[i++]);
 4304         (*pci_read_config_u32)(handle, 0x10, &cfg_reg_store[i++]);
 4305         (*pci_read_config_u32)(handle, 0x18, &cfg_reg_store[i++]);
 4306         (*pci_read_config_u32)(handle, 0x20, &cfg_reg_store[i++]);
 4307         (*pci_read_config_u32)(handle, 0x110, &cfg_reg_store[i++]);
 4308 
 4309         /* do flr */
 4310         (*pci_write_config_u32)(handle, AL_PCI_EXP_CAP_BASE + AL_PCI_EXP_DEVCTL, AL_PCI_EXP_DEVCTL_BCR_FLR);
 4311         al_udelay(1000);
 4312         /* restore command */
 4313         i = 0;
 4314         (*pci_write_config_u32)(handle, AL_PCI_COMMAND, cfg_reg_store[i++]);
 4315         (*pci_write_config_u32)(handle, 0xC, cfg_reg_store[i++]);
 4316         (*pci_write_config_u32)(handle, 0x10, cfg_reg_store[i++]);
 4317         (*pci_write_config_u32)(handle, 0x18, cfg_reg_store[i++]);
 4318         (*pci_write_config_u32)(handle, 0x20, cfg_reg_store[i++]);
 4319         (*pci_write_config_u32)(handle, 0x110, cfg_reg_store[i++]);
 4320 
 4321         al_reg_write32_masked(&mac_regs_base->gen.mux_sel, ETH_MAC_GEN_MUX_SEL_KR_IN_MASK, mux_sel);
 4322 
 4323         /* set SGMII clock to 125MHz */
 4324         al_reg_write32(&mac_regs_base->sgmii.clk_div, 0x03320501);
 4325 
 4326         /* reset 1G mac */
 4327         AL_REG_MASK_SET(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
 4328         (*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
 4329 
 4330         al_udelay(1000);
 4331 
 4332         /* clear 1G mac reset */
 4333         AL_REG_MASK_CLEAR(reg, AL_ADAPTER_GENERIC_CONTROL_0_ETH_RESET_1GMAC);
 4334         (*pci_write_config_u32)(handle, AL_ADAPTER_GENERIC_CONTROL_0, reg);
 4335 
 4336         /* reset SGMII mac clock to default */
 4337         al_reg_write32(&mac_regs_base->sgmii.clk_div, 0x00320501);
 4338         al_udelay(1000);
 4339         /* reset async fifo */
 4340         reg = al_reg_read32(&mac_regs_base->gen.sd_fifo_ctrl);
 4341         AL_REG_MASK_SET(reg, 0xF0);
 4342         al_reg_write32(&mac_regs_base->gen.sd_fifo_ctrl, reg);
 4343         reg = al_reg_read32(&mac_regs_base->gen.sd_fifo_ctrl);
 4344         AL_REG_MASK_CLEAR(reg, 0xF0);
 4345         al_reg_write32(&mac_regs_base->gen.sd_fifo_ctrl, reg);
 4346 
 4347         return 0;
 4348 }
 4349 
 4350 int al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val),
 4351                 int (* pci_write_config_u32)(void *handle, int where, uint32_t val),
 4352                 void *handle,
 4353                 void __iomem    *mac_base,
 4354                 void __iomem    *ec_base,
 4355                 int     mac_addresses_num
 4356                 )
 4357 {
 4358         struct al_eth_board_params params = { .media_type = 0 };
 4359         uint8_t mac_addr[6];
 4360         int rc;
 4361 
 4362         /* not implemented yet */
 4363         if (mac_addresses_num > 1)
 4364                 return -EPERM;
 4365 
 4366         /* save board params so we restore it after reset */
 4367         al_eth_board_params_get(mac_base, &params);
 4368         al_eth_mac_addr_read(ec_base, 0, mac_addr);
 4369 
 4370         rc = al_eth_flr_rmn(pci_read_config_u32, pci_write_config_u32, handle, mac_base);
 4371         al_eth_board_params_set(mac_base, &params);
 4372         al_eth_mac_addr_store(ec_base, 0, mac_addr);
 4373 
 4374         return rc;
 4375 }
 4376 
 4377 /* board params register 1 */
 4378 #define AL_HAL_ETH_MEDIA_TYPE_MASK      (AL_FIELD_MASK(3, 0))
 4379 #define AL_HAL_ETH_MEDIA_TYPE_SHIFT     0
 4380 #define AL_HAL_ETH_EXT_PHY_SHIFT        4
 4381 #define AL_HAL_ETH_PHY_ADDR_MASK        (AL_FIELD_MASK(9, 5))
 4382 #define AL_HAL_ETH_PHY_ADDR_SHIFT       5
 4383 #define AL_HAL_ETH_SFP_EXIST_SHIFT      10
 4384 #define AL_HAL_ETH_AN_ENABLE_SHIFT      11
 4385 #define AL_HAL_ETH_KR_LT_ENABLE_SHIFT   12
 4386 #define AL_HAL_ETH_KR_FEC_ENABLE_SHIFT  13
 4387 #define AL_HAL_ETH_MDIO_FREQ_MASK       (AL_FIELD_MASK(15, 14))
 4388 #define AL_HAL_ETH_MDIO_FREQ_SHIFT      14
 4389 #define AL_HAL_ETH_I2C_ADAPTER_ID_MASK  (AL_FIELD_MASK(19, 16))
 4390 #define AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT 16
 4391 #define AL_HAL_ETH_EXT_PHY_IF_MASK      (AL_FIELD_MASK(21, 20))
 4392 #define AL_HAL_ETH_EXT_PHY_IF_SHIFT     20
 4393 #define AL_HAL_ETH_AUTO_NEG_MODE_SHIFT  22
 4394 #define AL_HAL_ETH_SERDES_GRP_2_SHIFT   23
 4395 #define AL_HAL_ETH_SERDES_GRP_MASK      (AL_FIELD_MASK(26, 25))
 4396 #define AL_HAL_ETH_SERDES_GRP_SHIFT     25
 4397 #define AL_HAL_ETH_SERDES_LANE_MASK     (AL_FIELD_MASK(28, 27))
 4398 #define AL_HAL_ETH_SERDES_LANE_SHIFT    27
 4399 #define AL_HAL_ETH_REF_CLK_FREQ_MASK    (AL_FIELD_MASK(31, 29))
 4400 #define AL_HAL_ETH_REF_CLK_FREQ_SHIFT   29
 4401 
 4402 /* board params register 2 */
 4403 #define AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT   0
 4404 #define AL_HAL_ETH_1000_BASE_X_SHIFT            1
 4405 #define AL_HAL_ETH_1G_AN_DISABLE_SHIFT          2
 4406 #define AL_HAL_ETH_1G_SPEED_MASK                (AL_FIELD_MASK(4, 3))
 4407 #define AL_HAL_ETH_1G_SPEED_SHIFT               3
 4408 #define AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT         5
 4409 #define AL_HAL_ETH_1G_FC_DISABLE_SHIFT          6
 4410 #define AL_HAL_ETH_RETIMER_EXIST_SHIFT          7
 4411 #define AL_HAL_ETH_RETIMER_BUS_ID_MASK          (AL_FIELD_MASK(11, 8))
 4412 #define AL_HAL_ETH_RETIMER_BUS_ID_SHIFT         8
 4413 #define AL_HAL_ETH_RETIMER_I2C_ADDR_MASK        (AL_FIELD_MASK(18, 12))
 4414 #define AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT       12
 4415 #define AL_HAL_ETH_RETIMER_CHANNEL_SHIFT        19
 4416 #define AL_HAL_ETH_DAC_LENGTH_MASK              (AL_FIELD_MASK(23, 20))
 4417 #define AL_HAL_ETH_DAC_LENGTH_SHIFT             20
 4418 #define AL_HAL_ETH_DAC_SHIFT                    24
 4419 #define AL_HAL_ETH_RETIMER_TYPE_MASK            (AL_FIELD_MASK(26, 25))
 4420 #define AL_HAL_ETH_RETIMER_TYPE_SHIFT           25
 4421 #define AL_HAL_ETH_RETIMER_CHANNEL_2_MASK       (AL_FIELD_MASK(28, 27))
 4422 #define AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT      27
 4423 #define AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK      (AL_FIELD_MASK(31, 29))
 4424 #define AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT     29
 4425 
 4426 /* board params register 3 */
 4427 #define AL_HAL_ETH_GPIO_SFP_PRESENT_MASK        (AL_FIELD_MASK(5, 0))
 4428 #define AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT       0
 4429 
 4430 int al_eth_board_params_set(void * __iomem mac_base, struct al_eth_board_params *params)
 4431 {
 4432         struct al_eth_mac_regs __iomem *mac_regs_base =
 4433                 (struct al_eth_mac_regs __iomem *)mac_base;
 4434         uint32_t        reg = 0;
 4435 
 4436         /* ************* Setting Board params register 1 **************** */
 4437         AL_REG_FIELD_SET(reg, AL_HAL_ETH_MEDIA_TYPE_MASK,
 4438                          AL_HAL_ETH_MEDIA_TYPE_SHIFT, params->media_type);
 4439         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_EXT_PHY_SHIFT, params->phy_exist == AL_TRUE);
 4440         AL_REG_FIELD_SET(reg, AL_HAL_ETH_PHY_ADDR_MASK,
 4441                          AL_HAL_ETH_PHY_ADDR_SHIFT, params->phy_mdio_addr);
 4442 
 4443         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_SFP_EXIST_SHIFT, params->sfp_plus_module_exist == AL_TRUE);
 4444 
 4445         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_AN_ENABLE_SHIFT, params->autoneg_enable == AL_TRUE);
 4446         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_KR_LT_ENABLE_SHIFT, params->kr_lt_enable == AL_TRUE);
 4447         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_KR_FEC_ENABLE_SHIFT, params->kr_fec_enable == AL_TRUE);
 4448         AL_REG_FIELD_SET(reg, AL_HAL_ETH_MDIO_FREQ_MASK,
 4449                          AL_HAL_ETH_MDIO_FREQ_SHIFT, params->mdio_freq);
 4450         AL_REG_FIELD_SET(reg, AL_HAL_ETH_I2C_ADAPTER_ID_MASK,
 4451                          AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT, params->i2c_adapter_id);
 4452         AL_REG_FIELD_SET(reg, AL_HAL_ETH_EXT_PHY_IF_MASK,
 4453                          AL_HAL_ETH_EXT_PHY_IF_SHIFT, params->phy_if);
 4454 
 4455         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_AUTO_NEG_MODE_SHIFT,
 4456                            params->an_mode == AL_ETH_BOARD_AUTONEG_IN_BAND);
 4457 
 4458         AL_REG_FIELD_SET(reg, AL_HAL_ETH_SERDES_GRP_MASK,
 4459                          AL_HAL_ETH_SERDES_GRP_SHIFT, params->serdes_grp);
 4460 
 4461         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_SERDES_GRP_2_SHIFT,
 4462                         (params->serdes_grp & AL_BIT(2)) ? 1 : 0);
 4463 
 4464         AL_REG_FIELD_SET(reg, AL_HAL_ETH_SERDES_LANE_MASK,
 4465                          AL_HAL_ETH_SERDES_LANE_SHIFT, params->serdes_lane);
 4466 
 4467         AL_REG_FIELD_SET(reg, AL_HAL_ETH_REF_CLK_FREQ_MASK,
 4468                          AL_HAL_ETH_REF_CLK_FREQ_SHIFT, params->ref_clk_freq);
 4469 
 4470         al_assert(reg != 0);
 4471 
 4472         al_reg_write32(&mac_regs_base->mac_1g.scratch, reg);
 4473 
 4474         /* ************* Setting Board params register 2 **************** */
 4475         reg = 0;
 4476         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT,
 4477                            params->dont_override_serdes == AL_TRUE);
 4478 
 4479         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1000_BASE_X_SHIFT,
 4480                            params->force_1000_base_x == AL_TRUE);
 4481 
 4482         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_AN_DISABLE_SHIFT,
 4483                            params->an_disable == AL_TRUE);
 4484 
 4485         AL_REG_FIELD_SET(reg, AL_HAL_ETH_1G_SPEED_MASK,
 4486                          AL_HAL_ETH_1G_SPEED_SHIFT, params->speed);
 4487 
 4488         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT,
 4489                            params->half_duplex == AL_TRUE);
 4490 
 4491         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_1G_FC_DISABLE_SHIFT,
 4492                            params->fc_disable == AL_TRUE);
 4493 
 4494         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_RETIMER_EXIST_SHIFT, params->retimer_exist == AL_TRUE);
 4495         AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_BUS_ID_MASK,
 4496                          AL_HAL_ETH_RETIMER_BUS_ID_SHIFT, params->retimer_bus_id);
 4497         AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_I2C_ADDR_MASK,
 4498                          AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT, params->retimer_i2c_addr);
 4499 
 4500         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_RETIMER_CHANNEL_SHIFT,
 4501                                 (params->retimer_channel & AL_BIT(0)));
 4502 
 4503         AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_CHANNEL_2_MASK,
 4504                          AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT,
 4505                          (AL_REG_FIELD_GET(params->retimer_channel, 0x6, 1)));
 4506 
 4507         AL_REG_FIELD_SET(reg, AL_HAL_ETH_DAC_LENGTH_MASK,
 4508                          AL_HAL_ETH_DAC_LENGTH_SHIFT, params->dac_len);
 4509         AL_REG_BIT_VAL_SET(reg, AL_HAL_ETH_DAC_SHIFT, params->dac);
 4510 
 4511         AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_TYPE_MASK,
 4512                          AL_HAL_ETH_RETIMER_TYPE_SHIFT, params->retimer_type);
 4513 
 4514         AL_REG_FIELD_SET(reg, AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK,
 4515                          AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT,
 4516                          params->retimer_tx_channel);
 4517 
 4518         al_reg_write32(&mac_regs_base->mac_10g.scratch, reg);
 4519 
 4520         /* ************* Setting Board params register 3 **************** */
 4521         reg = 0;
 4522 
 4523         AL_REG_FIELD_SET(reg, AL_HAL_ETH_GPIO_SFP_PRESENT_MASK,
 4524                          AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT,
 4525                          params->gpio_sfp_present);
 4526 
 4527         al_reg_write32(&mac_regs_base->mac_1g.mac_0, reg);
 4528 
 4529         return 0;
 4530 }
 4531 
 4532 int al_eth_board_params_get(void * __iomem mac_base, struct al_eth_board_params *params)
 4533 {
 4534         struct al_eth_mac_regs __iomem *mac_regs_base =
 4535                 (struct al_eth_mac_regs __iomem *)mac_base;
 4536         uint32_t        reg = al_reg_read32(&mac_regs_base->mac_1g.scratch);
 4537 
 4538         /* check if the register was initialized, 0 is not a valid value */
 4539         if (reg == 0)
 4540                 return -ENOENT;
 4541 
 4542         /* ************* Getting Board params register 1 **************** */
 4543         params->media_type = AL_REG_FIELD_GET(reg, AL_HAL_ETH_MEDIA_TYPE_MASK,
 4544                                               AL_HAL_ETH_MEDIA_TYPE_SHIFT);
 4545         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_EXT_PHY_SHIFT))
 4546                 params->phy_exist = AL_TRUE;
 4547         else
 4548                 params->phy_exist = AL_FALSE;
 4549 
 4550         params->phy_mdio_addr = AL_REG_FIELD_GET(reg, AL_HAL_ETH_PHY_ADDR_MASK,
 4551                                                  AL_HAL_ETH_PHY_ADDR_SHIFT);
 4552 
 4553         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_SFP_EXIST_SHIFT))
 4554                 params->sfp_plus_module_exist = AL_TRUE;
 4555         else
 4556                 params->sfp_plus_module_exist = AL_FALSE;
 4557 
 4558         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_AN_ENABLE_SHIFT))
 4559                 params->autoneg_enable = AL_TRUE;
 4560         else
 4561                 params->autoneg_enable = AL_FALSE;
 4562 
 4563         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_KR_LT_ENABLE_SHIFT))
 4564                 params->kr_lt_enable = AL_TRUE;
 4565         else
 4566                 params->kr_lt_enable = AL_FALSE;
 4567 
 4568         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_KR_FEC_ENABLE_SHIFT))
 4569                 params->kr_fec_enable = AL_TRUE;
 4570         else
 4571                 params->kr_fec_enable = AL_FALSE;
 4572 
 4573         params->mdio_freq = AL_REG_FIELD_GET(reg,
 4574                                              AL_HAL_ETH_MDIO_FREQ_MASK,
 4575                                              AL_HAL_ETH_MDIO_FREQ_SHIFT);
 4576 
 4577         params->i2c_adapter_id = AL_REG_FIELD_GET(reg,
 4578                                                   AL_HAL_ETH_I2C_ADAPTER_ID_MASK,
 4579                                                   AL_HAL_ETH_I2C_ADAPTER_ID_SHIFT);
 4580 
 4581         params->phy_if = AL_REG_FIELD_GET(reg,
 4582                                           AL_HAL_ETH_EXT_PHY_IF_MASK,
 4583                                           AL_HAL_ETH_EXT_PHY_IF_SHIFT);
 4584 
 4585         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_AUTO_NEG_MODE_SHIFT))
 4586                 params->an_mode = AL_TRUE;
 4587         else
 4588                 params->an_mode = AL_FALSE;
 4589 
 4590         params->serdes_grp = AL_REG_FIELD_GET(reg,
 4591                                               AL_HAL_ETH_SERDES_GRP_MASK,
 4592                                               AL_HAL_ETH_SERDES_GRP_SHIFT);
 4593 
 4594         params->serdes_grp |= (AL_REG_BIT_GET(reg, AL_HAL_ETH_SERDES_GRP_2_SHIFT) ? AL_BIT(2) : 0);
 4595 
 4596         params->serdes_lane = AL_REG_FIELD_GET(reg,
 4597                                                AL_HAL_ETH_SERDES_LANE_MASK,
 4598                                                AL_HAL_ETH_SERDES_LANE_SHIFT);
 4599 
 4600         params->ref_clk_freq = AL_REG_FIELD_GET(reg,
 4601                                                 AL_HAL_ETH_REF_CLK_FREQ_MASK,
 4602                                                 AL_HAL_ETH_REF_CLK_FREQ_SHIFT);
 4603 
 4604         /* ************* Getting Board params register 2 **************** */
 4605         reg = al_reg_read32(&mac_regs_base->mac_10g.scratch);
 4606         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_DONT_OVERRIDE_SERDES_SHIFT))
 4607                 params->dont_override_serdes = AL_TRUE;
 4608         else
 4609                 params->dont_override_serdes = AL_FALSE;
 4610 
 4611         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1000_BASE_X_SHIFT))
 4612                 params->force_1000_base_x = AL_TRUE;
 4613         else
 4614                 params->force_1000_base_x = AL_FALSE;
 4615 
 4616         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_AN_DISABLE_SHIFT))
 4617                 params->an_disable = AL_TRUE;
 4618         else
 4619                 params->an_disable = AL_FALSE;
 4620 
 4621         params->speed = AL_REG_FIELD_GET(reg,
 4622                                          AL_HAL_ETH_1G_SPEED_MASK,
 4623                                          AL_HAL_ETH_1G_SPEED_SHIFT);
 4624 
 4625         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_HALF_DUPLEX_SHIFT))
 4626                 params->half_duplex = AL_TRUE;
 4627         else
 4628                 params->half_duplex = AL_FALSE;
 4629 
 4630         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_1G_FC_DISABLE_SHIFT))
 4631                 params->fc_disable = AL_TRUE;
 4632         else
 4633                 params->fc_disable = AL_FALSE;
 4634 
 4635         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_RETIMER_EXIST_SHIFT))
 4636                 params->retimer_exist = AL_TRUE;
 4637         else
 4638                 params->retimer_exist = AL_FALSE;
 4639 
 4640         params->retimer_bus_id = AL_REG_FIELD_GET(reg,
 4641                                                AL_HAL_ETH_RETIMER_BUS_ID_MASK,
 4642                                                AL_HAL_ETH_RETIMER_BUS_ID_SHIFT);
 4643         params->retimer_i2c_addr = AL_REG_FIELD_GET(reg,
 4644                                                AL_HAL_ETH_RETIMER_I2C_ADDR_MASK,
 4645                                                AL_HAL_ETH_RETIMER_I2C_ADDR_SHIFT);
 4646 
 4647         params->retimer_channel =
 4648                 ((AL_REG_BIT_GET(reg, AL_HAL_ETH_RETIMER_CHANNEL_SHIFT)) |
 4649                  (AL_REG_FIELD_GET(reg, AL_HAL_ETH_RETIMER_CHANNEL_2_MASK,
 4650                                    AL_HAL_ETH_RETIMER_CHANNEL_2_SHIFT) << 1));
 4651 
 4652         params->dac_len = AL_REG_FIELD_GET(reg,
 4653                                            AL_HAL_ETH_DAC_LENGTH_MASK,
 4654                                            AL_HAL_ETH_DAC_LENGTH_SHIFT);
 4655 
 4656         if (AL_REG_BIT_GET(reg, AL_HAL_ETH_DAC_SHIFT))
 4657                 params->dac = AL_TRUE;
 4658         else
 4659                 params->dac = AL_FALSE;
 4660 
 4661         params->retimer_type = AL_REG_FIELD_GET(reg,
 4662                                            AL_HAL_ETH_RETIMER_TYPE_MASK,
 4663                                            AL_HAL_ETH_RETIMER_TYPE_SHIFT);
 4664 
 4665         params->retimer_tx_channel = AL_REG_FIELD_GET(reg,
 4666                                            AL_HAL_ETH_RETIMER_TX_CHANNEL_MASK,
 4667                                            AL_HAL_ETH_RETIMER_TX_CHANNEL_SHIFT);
 4668 
 4669         /* ************* Getting Board params register 3 **************** */
 4670         reg = al_reg_read32(&mac_regs_base->mac_1g.mac_0);
 4671 
 4672         params->gpio_sfp_present = AL_REG_FIELD_GET(reg,
 4673                                         AL_HAL_ETH_GPIO_SFP_PRESENT_MASK,
 4674                                         AL_HAL_ETH_GPIO_SFP_PRESENT_SHIFT);
 4675 
 4676         return 0;
 4677 }
 4678 
 4679 /* Wake-On-Lan (WoL) */
 4680 static inline void al_eth_byte_arr_to_reg(
 4681                 uint32_t *reg, uint8_t *arr, unsigned int num_bytes)
 4682 {
 4683         uint32_t mask = 0xff;
 4684         unsigned int i;
 4685 
 4686         al_assert(num_bytes <= 4);
 4687 
 4688         *reg = 0;
 4689 
 4690         for (i = 0 ; i < num_bytes ; i++) {
 4691                 AL_REG_FIELD_SET(*reg, mask, (sizeof(uint8_t) * i), arr[i]);
 4692                 mask = mask << sizeof(uint8_t);
 4693         }
 4694 }
 4695 
 4696 int al_eth_wol_enable(
 4697                 struct al_hal_eth_adapter *adapter,
 4698                 struct al_eth_wol_params *wol)
 4699 {
 4700         uint32_t reg = 0;
 4701 
 4702         if (wol->int_mask & AL_ETH_WOL_INT_MAGIC_PSWD) {
 4703                 al_assert(wol->pswd != NULL);
 4704 
 4705                 al_eth_byte_arr_to_reg(&reg, &wol->pswd[0], 4);
 4706                 al_reg_write32(&adapter->ec_regs_base->wol.magic_pswd_l, reg);
 4707 
 4708                 al_eth_byte_arr_to_reg(&reg, &wol->pswd[4], 2);
 4709                 al_reg_write32(&adapter->ec_regs_base->wol.magic_pswd_h, reg);
 4710         }
 4711 
 4712         if (wol->int_mask & AL_ETH_WOL_INT_IPV4) {
 4713                 al_assert(wol->ipv4 != NULL);
 4714 
 4715                 al_eth_byte_arr_to_reg(&reg, &wol->ipv4[0], 4);
 4716                 al_reg_write32(&adapter->ec_regs_base->wol.ipv4_dip, reg);
 4717         }
 4718 
 4719         if (wol->int_mask & AL_ETH_WOL_INT_IPV6) {
 4720                 al_assert(wol->ipv6 != NULL);
 4721 
 4722                 al_eth_byte_arr_to_reg(&reg, &wol->ipv6[0], 4);
 4723                 al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word0, reg);
 4724 
 4725                 al_eth_byte_arr_to_reg(&reg, &wol->ipv6[4], 4);
 4726                 al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word1, reg);
 4727 
 4728                 al_eth_byte_arr_to_reg(&reg, &wol->ipv6[8], 4);
 4729                 al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word2, reg);
 4730 
 4731                 al_eth_byte_arr_to_reg(&reg, &wol->ipv6[12], 4);
 4732                 al_reg_write32(&adapter->ec_regs_base->wol.ipv6_dip_word3, reg);
 4733         }
 4734 
 4735         if (wol->int_mask &
 4736                 (AL_ETH_WOL_INT_ETHERTYPE_BC | AL_ETH_WOL_INT_ETHERTYPE_DA)) {
 4737 
 4738                 reg = ((uint32_t)wol->ethr_type2 << 16);
 4739                 reg |= wol->ethr_type1;
 4740 
 4741                 al_reg_write32(&adapter->ec_regs_base->wol.ethertype, reg);
 4742         }
 4743 
 4744         /* make sure we dont forwarding packets without interrupt */
 4745         al_assert((wol->forward_mask | wol->int_mask) == wol->int_mask);
 4746 
 4747         reg = ((uint32_t)wol->forward_mask << 16);
 4748         reg |= wol->int_mask;
 4749         al_reg_write32(&adapter->ec_regs_base->wol.wol_en, reg);
 4750 
 4751         return 0;
 4752 }
 4753 
 4754 int al_eth_wol_disable(
 4755                 struct al_hal_eth_adapter *adapter)
 4756 {
 4757         al_reg_write32(&adapter->ec_regs_base->wol.wol_en, 0);
 4758 
 4759         return 0;
 4760 }
 4761 
 4762 int al_eth_tx_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 4763                                 uint8_t udma_mask, al_bool fwd_to_mac)
 4764 {
 4765         uint32_t        val = 0;
 4766         al_assert(idx < AL_ETH_FWD_VID_TABLE_NUM); /* valid VID index */
 4767         AL_REG_FIELD_SET(val,  AL_ETH_TX_VLAN_TABLE_UDMA_MASK, 0, udma_mask);
 4768         AL_REG_FIELD_SET(val,  AL_ETH_TX_VLAN_TABLE_FWD_TO_MAC, 4, fwd_to_mac);
 4769 
 4770         al_reg_write32(&adapter->ec_regs_base->tfw.tx_vid_table_addr, idx);
 4771         al_reg_write32(&adapter->ec_regs_base->tfw.tx_vid_table_data, val);
 4772         return 0;
 4773 }
 4774 
 4775 int al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 4776                 struct al_eth_tx_gpd_cam_entry *tx_gpd_entry)
 4777 {
 4778         uint64_t gpd_data;
 4779         uint64_t gpd_mask;
 4780 
 4781         gpd_data = ((uint64_t)tx_gpd_entry->l3_proto_idx & AL_ETH_TX_GPD_L3_PROTO_MASK) <<
 4782                 AL_ETH_TX_GPD_L3_PROTO_SHIFT;
 4783         gpd_data |= ((uint64_t)tx_gpd_entry->l4_proto_idx & AL_ETH_TX_GPD_L4_PROTO_MASK) <<
 4784                 AL_ETH_TX_GPD_L4_PROTO_SHIFT;
 4785         gpd_data |= ((uint64_t)tx_gpd_entry->tunnel_control & AL_ETH_TX_GPD_TUNNEL_CTRL_MASK) <<
 4786                 AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT;
 4787         gpd_data |= ((uint64_t)tx_gpd_entry->source_vlan_count & AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK) <<
 4788                 AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT;
 4789         gpd_mask  = ((uint64_t)tx_gpd_entry->l3_proto_idx_mask & AL_ETH_TX_GPD_L3_PROTO_MASK) <<
 4790                 AL_ETH_TX_GPD_L3_PROTO_SHIFT;
 4791         gpd_mask |= ((uint64_t)tx_gpd_entry->l4_proto_idx_mask & AL_ETH_TX_GPD_L4_PROTO_MASK) <<
 4792                 AL_ETH_TX_GPD_L4_PROTO_SHIFT;
 4793         gpd_mask |= ((uint64_t)tx_gpd_entry->tunnel_control_mask & AL_ETH_TX_GPD_TUNNEL_CTRL_MASK) <<
 4794                 AL_ETH_TX_GPD_TUNNEL_CTRL_SHIFT;
 4795         gpd_mask |= ((uint64_t)tx_gpd_entry->source_vlan_count_mask & AL_ETH_TX_GPD_SRC_VLAN_CNT_MASK) <<
 4796                 AL_ETH_TX_GPD_SRC_VLAN_CNT_SHIFT;
 4797 
 4798         /* Tx Generic protocol detect Cam compare table */
 4799         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_addr, idx);
 4800         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_ctrl,
 4801                         (uint32_t)((tx_gpd_entry->tx_gpd_cam_ctrl) << AL_ETH_TX_GPD_CAM_CTRL_VALID_SHIFT));
 4802         al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_ctrl: %#x", idx, tx_gpd_entry->tx_gpd_cam_ctrl);
 4803         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_mask_2,
 4804                         (uint32_t)(gpd_mask >> AL_ETH_TX_GPD_CAM_MASK_2_SHIFT));
 4805         al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_mask_2: %#x", idx, (uint32_t)(gpd_mask >> AL_ETH_TX_GPD_CAM_MASK_2_SHIFT));
 4806         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_mask_1,
 4807                         (uint32_t)(gpd_mask));
 4808         al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_mask_1: %#x", idx, (uint32_t)(gpd_mask));
 4809         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_data_2,
 4810                         (uint32_t)(gpd_data >> AL_ETH_TX_GPD_CAM_DATA_2_SHIFT));
 4811         al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_data_2: %#x", idx, (uint32_t)(gpd_data >> AL_ETH_TX_GPD_CAM_DATA_2_SHIFT));
 4812         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gpd_cam_data_1,
 4813                         (uint32_t)(gpd_data));
 4814         al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], tx_gpd_cam_data_1: %#x", idx, (uint32_t)(gpd_data));
 4815         return 0;
 4816 }
 4817 
 4818 int al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 4819                 struct al_eth_tx_gcp_table_entry *tx_gcp_entry)
 4820 {
 4821         uint32_t gcp_table_gen;
 4822         uint32_t tx_alu_opcode;
 4823         uint32_t tx_alu_opsel;
 4824 
 4825         gcp_table_gen  = (tx_gcp_entry->poly_sel & AL_ETH_TX_GCP_POLY_SEL_MASK) <<
 4826                 AL_ETH_TX_GCP_POLY_SEL_SHIFT;
 4827         gcp_table_gen |= (tx_gcp_entry->crc32_bit_comp & AL_ETH_TX_GCP_CRC32_BIT_COMP_MASK) <<
 4828                 AL_ETH_TX_GCP_CRC32_BIT_COMP_SHIFT;
 4829         gcp_table_gen |= (tx_gcp_entry->crc32_bit_swap & AL_ETH_TX_GCP_CRC32_BIT_SWAP_MASK) <<
 4830                 AL_ETH_TX_GCP_CRC32_BIT_SWAP_SHIFT;
 4831         gcp_table_gen |= (tx_gcp_entry->crc32_byte_swap & AL_ETH_TX_GCP_CRC32_BYTE_SWAP_MASK) <<
 4832                 AL_ETH_TX_GCP_CRC32_BYTE_SWAP_SHIFT;
 4833         gcp_table_gen |= (tx_gcp_entry->data_bit_swap & AL_ETH_TX_GCP_DATA_BIT_SWAP_MASK) <<
 4834                 AL_ETH_TX_GCP_DATA_BIT_SWAP_SHIFT;
 4835         gcp_table_gen |= (tx_gcp_entry->data_byte_swap & AL_ETH_TX_GCP_DATA_BYTE_SWAP_MASK) <<
 4836                 AL_ETH_TX_GCP_DATA_BYTE_SWAP_SHIFT;
 4837         gcp_table_gen |= (tx_gcp_entry->trail_size & AL_ETH_TX_GCP_TRAIL_SIZE_MASK) <<
 4838                 AL_ETH_TX_GCP_TRAIL_SIZE_SHIFT;
 4839         gcp_table_gen |= (tx_gcp_entry->head_size & AL_ETH_TX_GCP_HEAD_SIZE_MASK) <<
 4840                 AL_ETH_TX_GCP_HEAD_SIZE_SHIFT;
 4841         gcp_table_gen |= (tx_gcp_entry->head_calc & AL_ETH_TX_GCP_HEAD_CALC_MASK) <<
 4842                 AL_ETH_TX_GCP_HEAD_CALC_SHIFT;
 4843         gcp_table_gen |= (tx_gcp_entry->mask_polarity & AL_ETH_TX_GCP_MASK_POLARITY_MASK) <<
 4844                 AL_ETH_TX_GCP_MASK_POLARITY_SHIFT;
 4845         al_dbg("al_eth_tx_generic_crc_entry_set, line [%d], gcp_table_gen: %#x", idx, gcp_table_gen);
 4846 
 4847         tx_alu_opcode  = (tx_gcp_entry->tx_alu_opcode_1 & AL_ETH_TX_GCP_OPCODE_1_MASK) <<
 4848                 AL_ETH_TX_GCP_OPCODE_1_SHIFT;
 4849         tx_alu_opcode |= (tx_gcp_entry->tx_alu_opcode_2 & AL_ETH_TX_GCP_OPCODE_2_MASK) <<
 4850                 AL_ETH_TX_GCP_OPCODE_2_SHIFT;
 4851         tx_alu_opcode |= (tx_gcp_entry->tx_alu_opcode_3 & AL_ETH_TX_GCP_OPCODE_3_MASK) <<
 4852                 AL_ETH_TX_GCP_OPCODE_3_SHIFT;
 4853         tx_alu_opsel  = (tx_gcp_entry->tx_alu_opsel_1 & AL_ETH_TX_GCP_OPSEL_1_MASK) <<
 4854                 AL_ETH_TX_GCP_OPSEL_1_SHIFT;
 4855         tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_2 & AL_ETH_TX_GCP_OPSEL_2_MASK) <<
 4856                 AL_ETH_TX_GCP_OPSEL_2_SHIFT;
 4857         tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_3 & AL_ETH_TX_GCP_OPSEL_3_MASK) <<
 4858                 AL_ETH_TX_GCP_OPSEL_3_SHIFT;
 4859         tx_alu_opsel |= (tx_gcp_entry->tx_alu_opsel_4 & AL_ETH_TX_GCP_OPSEL_4_MASK) <<
 4860                 AL_ETH_TX_GCP_OPSEL_4_SHIFT;
 4861 
 4862         /*  Tx Generic crc prameters table general */
 4863         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_addr, idx);
 4864         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_gen,
 4865                         gcp_table_gen);
 4866         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_1,
 4867                         tx_gcp_entry->gcp_mask[0]);
 4868         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_2,
 4869                         tx_gcp_entry->gcp_mask[1]);
 4870         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_3,
 4871                         tx_gcp_entry->gcp_mask[2]);
 4872         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_4,
 4873                         tx_gcp_entry->gcp_mask[3]);
 4874         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_5,
 4875                         tx_gcp_entry->gcp_mask[4]);
 4876         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_mask_6,
 4877                         tx_gcp_entry->gcp_mask[5]);
 4878         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_crc_init,
 4879                         tx_gcp_entry->crc_init);
 4880         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_res,
 4881                         tx_gcp_entry->gcp_table_res);
 4882         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_opcode,
 4883                         tx_alu_opcode);
 4884         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_opsel,
 4885                         tx_alu_opsel);
 4886         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_table_alu_val,
 4887                         tx_gcp_entry->alu_val);
 4888         return 0;
 4889 }
 4890 
 4891 int al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 4892                 struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry *tx_replace_entry)
 4893 {
 4894         uint32_t replace_table_address;
 4895         uint32_t tx_replace_cmd;
 4896 
 4897         /*  Tx crc_chksum_replace_cmd */
 4898         replace_table_address = L4_CHECKSUM_DIS_AND_L3_CHECKSUM_DIS | idx;
 4899         tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_00) << 0;
 4900         tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_00) << 1;
 4901         tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_00)     << 2;
 4902         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
 4903         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
 4904                         tx_replace_cmd);
 4905         replace_table_address = L4_CHECKSUM_DIS_AND_L3_CHECKSUM_EN | idx;
 4906         tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_01) << 0;
 4907         tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_01) << 1;
 4908         tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_01)     << 2;
 4909         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
 4910         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
 4911                         tx_replace_cmd);
 4912         replace_table_address = L4_CHECKSUM_EN_AND_L3_CHECKSUM_DIS | idx;
 4913         tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_10) << 0;
 4914         tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_10) << 1;
 4915         tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_10)     << 2;
 4916         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
 4917         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
 4918                         tx_replace_cmd);
 4919         replace_table_address = L4_CHECKSUM_EN_AND_L3_CHECKSUM_EN | idx;
 4920         tx_replace_cmd  = (uint32_t)(tx_replace_entry->l3_csum_en_11) << 0;
 4921         tx_replace_cmd |= (uint32_t)(tx_replace_entry->l4_csum_en_11) << 1;
 4922         tx_replace_cmd |= (uint32_t)(tx_replace_entry->crc_en_11)     << 2;
 4923         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table_addr, replace_table_address);
 4924         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace_table,
 4925                         tx_replace_cmd);
 4926 
 4927         return 0;
 4928 }
 4929 
 4930 int al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 4931                 struct al_eth_rx_gpd_cam_entry *rx_gpd_entry)
 4932 {
 4933         uint64_t gpd_data;
 4934         uint64_t gpd_mask;
 4935 
 4936         gpd_data  = ((uint64_t)rx_gpd_entry->outer_l3_proto_idx & AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK) <<
 4937                 AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT;
 4938         gpd_data |= ((uint64_t)rx_gpd_entry->outer_l4_proto_idx & AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK) <<
 4939                 AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT;
 4940         gpd_data |= ((uint64_t)rx_gpd_entry->inner_l3_proto_idx & AL_ETH_RX_GPD_INNER_L3_PROTO_MASK) <<
 4941                 AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT;
 4942         gpd_data |= ((uint64_t)rx_gpd_entry->inner_l4_proto_idx & AL_ETH_RX_GPD_INNER_L4_PROTO_MASK) <<
 4943                 AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT;
 4944         gpd_data |= ((uint64_t)rx_gpd_entry->parse_ctrl & AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK) <<
 4945                 AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT;
 4946         gpd_data |= ((uint64_t)rx_gpd_entry->outer_l3_len & AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK) <<
 4947                 AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT;
 4948         gpd_data |= ((uint64_t)rx_gpd_entry->l3_priority & AL_ETH_RX_GPD_L3_PRIORITY_MASK) <<
 4949                 AL_ETH_RX_GPD_L3_PRIORITY_SHIFT;
 4950         gpd_data |= ((uint64_t)rx_gpd_entry->l4_dst_port_lsb & AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK) <<
 4951                 AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT;
 4952 
 4953         gpd_mask  = ((uint64_t)rx_gpd_entry->outer_l3_proto_idx_mask & AL_ETH_RX_GPD_OUTER_L3_PROTO_MASK) <<
 4954                 AL_ETH_RX_GPD_OUTER_L3_PROTO_SHIFT;
 4955         gpd_mask |= ((uint64_t)rx_gpd_entry->outer_l4_proto_idx_mask & AL_ETH_RX_GPD_OUTER_L4_PROTO_MASK) <<
 4956                 AL_ETH_RX_GPD_OUTER_L4_PROTO_SHIFT;
 4957         gpd_mask |= ((uint64_t)rx_gpd_entry->inner_l3_proto_idx_mask & AL_ETH_RX_GPD_INNER_L3_PROTO_MASK) <<
 4958                 AL_ETH_RX_GPD_INNER_L3_PROTO_SHIFT;
 4959         gpd_mask |= ((uint64_t)rx_gpd_entry->inner_l4_proto_idx_mask & AL_ETH_RX_GPD_INNER_L4_PROTO_MASK) <<
 4960                 AL_ETH_RX_GPD_INNER_L4_PROTO_SHIFT;
 4961         gpd_mask |= ((uint64_t)rx_gpd_entry->parse_ctrl_mask & AL_ETH_RX_GPD_OUTER_PARSE_CTRL_MASK) <<
 4962                 AL_ETH_RX_GPD_OUTER_PARSE_CTRL_SHIFT;
 4963         gpd_mask |= ((uint64_t)rx_gpd_entry->outer_l3_len_mask & AL_ETH_RX_GPD_INNER_PARSE_CTRL_MASK) <<
 4964                 AL_ETH_RX_GPD_INNER_PARSE_CTRL_SHIFT;
 4965         gpd_mask |= ((uint64_t)rx_gpd_entry->l3_priority_mask & AL_ETH_RX_GPD_L3_PRIORITY_MASK) <<
 4966                 AL_ETH_RX_GPD_L3_PRIORITY_SHIFT;
 4967         gpd_mask |= ((uint64_t)rx_gpd_entry->l4_dst_port_lsb_mask & AL_ETH_RX_GPD_L4_DST_PORT_LSB_MASK) <<
 4968                 AL_ETH_RX_GPD_L4_DST_PORT_LSB_SHIFT;
 4969 
 4970         /* Rx Generic protocol detect Cam compare table */
 4971         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_addr, idx);
 4972         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_ctrl,
 4973                         (uint32_t)((rx_gpd_entry->rx_gpd_cam_ctrl) << AL_ETH_RX_GPD_CAM_CTRL_VALID_SHIFT));
 4974         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_mask_2,
 4975                         (uint32_t)(gpd_mask >> AL_ETH_RX_GPD_CAM_MASK_2_SHIFT));
 4976         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_mask_1,
 4977                         (uint32_t)(gpd_mask));
 4978         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_data_2,
 4979                         (uint32_t)(gpd_data >> AL_ETH_RX_GPD_CAM_DATA_2_SHIFT));
 4980         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gpd_cam_data_1,
 4981                         (uint32_t)(gpd_data));
 4982         return 0;
 4983 }
 4984 
 4985 int al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx,
 4986                 struct al_eth_rx_gcp_table_entry *rx_gcp_entry)
 4987 {
 4988         uint32_t gcp_table_gen;
 4989         uint32_t rx_alu_opcode;
 4990         uint32_t rx_alu_opsel;
 4991 
 4992         gcp_table_gen  = (rx_gcp_entry->poly_sel & AL_ETH_RX_GCP_POLY_SEL_MASK) <<
 4993                 AL_ETH_RX_GCP_POLY_SEL_SHIFT;
 4994         gcp_table_gen |= (rx_gcp_entry->crc32_bit_comp & AL_ETH_RX_GCP_CRC32_BIT_COMP_MASK) <<
 4995                 AL_ETH_RX_GCP_CRC32_BIT_COMP_SHIFT;
 4996         gcp_table_gen |= (rx_gcp_entry->crc32_bit_swap & AL_ETH_RX_GCP_CRC32_BIT_SWAP_MASK) <<
 4997                 AL_ETH_RX_GCP_CRC32_BIT_SWAP_SHIFT;
 4998         gcp_table_gen |= (rx_gcp_entry->crc32_byte_swap & AL_ETH_RX_GCP_CRC32_BYTE_SWAP_MASK) <<
 4999                 AL_ETH_RX_GCP_CRC32_BYTE_SWAP_SHIFT;
 5000         gcp_table_gen |= (rx_gcp_entry->data_bit_swap & AL_ETH_RX_GCP_DATA_BIT_SWAP_MASK) <<
 5001                 AL_ETH_RX_GCP_DATA_BIT_SWAP_SHIFT;
 5002         gcp_table_gen |= (rx_gcp_entry->data_byte_swap & AL_ETH_RX_GCP_DATA_BYTE_SWAP_MASK) <<
 5003                 AL_ETH_RX_GCP_DATA_BYTE_SWAP_SHIFT;
 5004         gcp_table_gen |= (rx_gcp_entry->trail_size & AL_ETH_RX_GCP_TRAIL_SIZE_MASK) <<
 5005                 AL_ETH_RX_GCP_TRAIL_SIZE_SHIFT;
 5006         gcp_table_gen |= (rx_gcp_entry->head_size & AL_ETH_RX_GCP_HEAD_SIZE_MASK) <<
 5007                 AL_ETH_RX_GCP_HEAD_SIZE_SHIFT;
 5008         gcp_table_gen |= (rx_gcp_entry->head_calc & AL_ETH_RX_GCP_HEAD_CALC_MASK) <<
 5009                 AL_ETH_RX_GCP_HEAD_CALC_SHIFT;
 5010         gcp_table_gen |= (rx_gcp_entry->mask_polarity & AL_ETH_RX_GCP_MASK_POLARITY_MASK) <<
 5011                 AL_ETH_RX_GCP_MASK_POLARITY_SHIFT;
 5012 
 5013         rx_alu_opcode  = (rx_gcp_entry->rx_alu_opcode_1 & AL_ETH_RX_GCP_OPCODE_1_MASK) <<
 5014                 AL_ETH_RX_GCP_OPCODE_1_SHIFT;
 5015         rx_alu_opcode |= (rx_gcp_entry->rx_alu_opcode_2 & AL_ETH_RX_GCP_OPCODE_2_MASK) <<
 5016                 AL_ETH_RX_GCP_OPCODE_2_SHIFT;
 5017         rx_alu_opcode |= (rx_gcp_entry->rx_alu_opcode_3 & AL_ETH_RX_GCP_OPCODE_3_MASK) <<
 5018                 AL_ETH_RX_GCP_OPCODE_3_SHIFT;
 5019         rx_alu_opsel  = (rx_gcp_entry->rx_alu_opsel_1 & AL_ETH_RX_GCP_OPSEL_1_MASK) <<
 5020                 AL_ETH_RX_GCP_OPSEL_1_SHIFT;
 5021         rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_2 & AL_ETH_RX_GCP_OPSEL_2_MASK) <<
 5022                 AL_ETH_RX_GCP_OPSEL_2_SHIFT;
 5023         rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_3 & AL_ETH_RX_GCP_OPSEL_3_MASK) <<
 5024                 AL_ETH_RX_GCP_OPSEL_3_SHIFT;
 5025         rx_alu_opsel |= (rx_gcp_entry->rx_alu_opsel_4 & AL_ETH_RX_GCP_OPSEL_4_MASK) <<
 5026                 AL_ETH_RX_GCP_OPSEL_4_SHIFT;
 5027 
 5028         /*  Rx Generic crc prameters table general */
 5029         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_addr, idx);
 5030         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_gen,
 5031                         gcp_table_gen);
 5032         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_1,
 5033                         rx_gcp_entry->gcp_mask[0]);
 5034         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_2,
 5035                         rx_gcp_entry->gcp_mask[1]);
 5036         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_3,
 5037                         rx_gcp_entry->gcp_mask[2]);
 5038         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_4,
 5039                         rx_gcp_entry->gcp_mask[3]);
 5040         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_5,
 5041                         rx_gcp_entry->gcp_mask[4]);
 5042         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_mask_6,
 5043                         rx_gcp_entry->gcp_mask[5]);
 5044         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_crc_init,
 5045                         rx_gcp_entry->crc_init);
 5046         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_res,
 5047                         rx_gcp_entry->gcp_table_res);
 5048         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_opcode,
 5049                         rx_alu_opcode);
 5050         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_opsel,
 5051                         rx_alu_opsel);
 5052         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_table_alu_val,
 5053                         rx_gcp_entry->alu_val);
 5054         return 0;
 5055 }
 5056 
 5057 
 5058 #define AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM 9
 5059 #define AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM 32
 5060 
 5061 static struct al_eth_tx_gpd_cam_entry
 5062 al_eth_generic_tx_crc_gpd[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
 5063 
 5064         /* [0] roce (with grh, bth) */
 5065         {22,            0,              0,              0,              1,
 5066          0x1f,          0x0,            0x0,            0x0,            },
 5067         /* [1] fcoe */
 5068         {21,            0,              0,              0,              1,
 5069          0x1f,          0x0,            0x0,            0x0,            },
 5070         /* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
 5071         {8,             23,             0,              0,              1,
 5072          0x1f,          0x1f,           0x0,            0x0,            },
 5073         /* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
 5074         {11,            23,             0,              0,              1,
 5075          0x1f,          0x1f,           0x0,            0x0,            },
 5076         /* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
 5077         {23,            0,              5,              0,              1,
 5078          0x1f,          0x0,            0x5,            0x0,            },
 5079         /* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
 5080         {23,            0,              3,              0,              1,
 5081          0x1f,          0x0,            0x5,            0x0             },
 5082         /* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
 5083         {8,             2,              0,              0,              1,
 5084          0x1f,          0x1f,           0x0,            0x0,            },
 5085         /* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
 5086         {11,            2,              0,              0,              1,
 5087          0x1f,          0x1f,           0x0,            0x0,            },
 5088         /* [8] default match */
 5089         {0,             0,              0,              0,              1,
 5090          0x0,           0x0,            0x0,            0x0             }
 5091 };
 5092 
 5093 static struct al_eth_tx_gcp_table_entry
 5094 al_eth_generic_tx_crc_gcp[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
 5095 
 5096         /* [0] roce (with grh, bth) */
 5097         {0,             1,              1,              0,              1,
 5098          0,             4,              8,              0,              1,
 5099          0,             0,              0,              0,              0,
 5100          0,             0,              {0xffff7f03,    0x00000000,     0x00000000,
 5101          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5102          0},
 5103         /* [1] fcoe */
 5104         {0,             1,              0,              0,              1,
 5105          0,             8,              14,             1,              1,
 5106          0,             0,              0,              0,              0,
 5107          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5108          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5109          0},
 5110         /* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
 5111         {0,             1,              1,              0,              1,
 5112          0,             4,              0,              0,              1,
 5113          0,             0,              0,              0,              0,
 5114          0,             0,              {0x3000cf00,    0x00000f00,     0xc0000000,
 5115          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5116          0},
 5117         /* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
 5118         {0,             1,              1,              0,              1,
 5119          0,             4,              0,              0,              1,
 5120          0,             0,              0,              0,              0,
 5121          0,             0,              {0x7f030000,    0x00000000,     0x00000003,
 5122          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5123          0},
 5124         /* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
 5125         {0,             1,              1,              0,              1,
 5126          0,             4,              0,              0,              1,
 5127          2,             0,              0,              0,              10,
 5128          0,             0,              {0x3000cf00,    0x00000f00,     0xc0000000,
 5129          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5130          28},
 5131         /* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
 5132         {0,             1,              1,              0,              1,
 5133          0,             4,              0,              0,              1,
 5134          2,             0,              0,              0,              10,
 5135          0,             0,              {0x7f030000,    0x00000000,     0x00000003,
 5136          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5137          48},
 5138         /* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
 5139         {1,             1,              1,              0,              1,
 5140          0,             4,              0,              0,              1,
 5141          1,             0,              1,              0,              2,
 5142          10,            0,              {0x00000000,    0x00000000,     0x00000000,
 5143          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5144          8},
 5145         /* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
 5146         {1,             1,              1,              0,              1,
 5147          0,             4,              0,              0,              1,
 5148          1,             0,              1,              0,              2,
 5149          10,            0,              {0x00000000,    0x00000000,     0x00000000,
 5150          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x0,
 5151          8},
 5152         /* [8] default match */
 5153         {0,             0,              0,              0,              0,
 5154          0,             0,              0,              0,              0,
 5155          0,             0,              0,              0,              0,
 5156          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5157          0x00000000,    0x00000000,       0x00000000},  0x00000000,     0x0,
 5158          0}
 5159 };
 5160 
 5161 static struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry
 5162 al_eth_tx_crc_chksum_replace_cmd[AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM] = {
 5163 
 5164         /* [0] roce (with grh, bth) */
 5165         {0,1,0,1,               0,0,0,0,                0,0,0,0},
 5166         /* [1] fcoe */
 5167         {0,1,0,1,               0,0,0,0,                0,0,0,0},
 5168         /* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
 5169         {0,0,1,1,               0,0,0,0,                0,1,0,1},
 5170         /* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
 5171         {0,0,1,1,               0,0,0,0,                0,0,0,0},
 5172         /* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
 5173         {0,1,0,1,               0,0,0,0,                0,0,0,0},
 5174         /* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
 5175         {0,1,0,1,               0,0,0,0,                0,0,0,0},
 5176         /* [6] GENERIC_STORAGE_READ over IPV4 (and udp) */
 5177         {0,0,1,1,               0,0,0,0,                0,1,0,1},
 5178         /* [7] GENERIC_STORAGE_READ over IPV6 (and udp) */
 5179         {0,0,1,1,               0,0,0,0,                0,0,0,0},
 5180         /* [8] default match */
 5181         {0,0,0,0,               0,0,1,1,                0,1,0,1}
 5182 };
 5183 
 5184 static struct al_eth_rx_gpd_cam_entry
 5185 al_eth_generic_rx_crc_gpd[AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM] = {
 5186 
 5187         /* [0] roce (with grh, bth) */
 5188         {22,            0,              0,              0,
 5189          0,             0,              0,              0,              1,
 5190          0x1f,          0x0,            0x0,            0x0,
 5191          0x4,           0x0,            0x0,            0x0},
 5192         /* [1] fcoe */
 5193         {21,            0,              0,              0,
 5194          0,             0,              0,              0,              1,
 5195          0x1f,          0x0,            0x0,            0x0,
 5196          0x4,           0x0,            0x0,            0x0},
 5197         /* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
 5198         {8,             23,             0,              0,
 5199          0,             0,              0,              0,              1,
 5200          0x1f,          0x1f,           0x0,            0x0,
 5201          0x4,           0x0,            0x0,            0x0},
 5202         /* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
 5203         {11,            23,             0,              0,
 5204          0,             0,              0,              0,              1,
 5205          0x1f,          0x1f,           0x0,            0x0,
 5206          0x4,           0x0,            0x0,            0x0},
 5207         /* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
 5208         {8,             13,             23,             0,
 5209          0,             0,              0,              0,              1,
 5210          0x1f,          0x1f,           0x1f,           0x0,
 5211          0x4,           0x0,            0x0,            0x0},
 5212         /* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
 5213         {11,            13,             23,             0,
 5214          0,             0,              0,              0,              1,
 5215          0x1f,          0x1f,           0x1f,           0x0,
 5216          0x4,           0x0,            0x0,            0x0},
 5217         /* [6] tunneled roce (with grh, bth) over GRE over IPV4 */
 5218         {8,             0,              22,             0,
 5219          4,             0,              0,              0,              1,
 5220          0x1f,          0x0,            0x1f,           0x0,
 5221          0x4,           0x0,            0x0,            0x0},
 5222         /* [7] tunneled roce (with grh, bth) over GRE over IPV6 */
 5223         {11,            0,              22,             0,
 5224          4,             0,              0,              0,              1,
 5225          0x1f,          0x0,            0x1f,           0x0,
 5226          0x4,           0x0,            0x0,            0x0},
 5227         /* [8] tunneled fcoe over IPV4 */
 5228         {8,             0,              21,             0,
 5229          4,             0,              0,              0,              1,
 5230          0x1f,          0x0,            0x1f,           0x0,
 5231          0x4,           0x0,            0x0,            0x0},
 5232         /* [9] tunneled fcoe over IPV6 */
 5233         {11,            0,              21,             0,
 5234          4,             0,              0,              0,              1,
 5235          0x1f,          0x0,            0x1f,           0x0,
 5236          0x4,           0x0,            0x0,            0x0},
 5237         /* [10] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV4 */
 5238         {8,             0,              8,              23,
 5239          4,             0,              0,              0,              1,
 5240         0x1f,           0x0,            0x1f,           0x1f,
 5241          0x4,           0x0,            0x0,            0x0},
 5242         /* [11] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV6 */
 5243         {11,            0,              8,              23,
 5244         4,              0,              0,              0,              1,
 5245         0x1f,           0x0,            0x1f,           0x1f,
 5246         0x4,            0x0,            0x0,            0x0},
 5247         /* [12] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV4 */
 5248         {8,             0,              11,             23,
 5249         4,              0,              0,              0,              1,
 5250         0x1f,           0x0,            0x1f,           0x1f,
 5251         0x4,            0x0,            0x0,            0x0},
 5252         /* [13] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV6 */
 5253         {11,            0,              11,             23,
 5254         4,              0,              0,              0,              1,
 5255         0x1f,           0x0,            0x1f,           0x1f,
 5256         0x4,            0x0,            0x0,            0x0},
 5257         /* [14] l3_pkt - IPV4 */
 5258         {8,             0,              0,              0,
 5259         0,              0,              0,              0,              1,
 5260         0x1f,           0x1f,           0x0,            0x0,
 5261         0x4,            0x0,            0x0,            0x0},
 5262         /* [15] l4_hdr over IPV4 */
 5263         {8,             12,             0,              0,
 5264         0,              0,              0,              0,              1,
 5265         0x1f,           0x1e,           0x0,            0x0,
 5266         0x4,            0x0,            0x0,            0x0},
 5267         /* [16] l3_pkt - IPV6 */
 5268         {11,            0,              0,              0,
 5269         0,              0,              0,              0,              1,
 5270         0x1f,           0x1f,           0x0,            0x0,
 5271         0x4,            0x0,            0x0,            0x0},
 5272         /* [17] l4_hdr over IPV6 */
 5273         {11,            12,             0,              0,
 5274         0,              0,              0,              0,              1,
 5275         0x1f,           0x1e,           0x0,            0x0,
 5276         0x4,            0x0,            0x0,            0x0},
 5277         /* [18] IPV4 over IPV4 */
 5278         {8,             0,              8,              0,
 5279         4,              0,              0,              0,              1,
 5280         0x1f,           0x0,            0x1f,           0x1f,
 5281         0x4,            0x0,            0x0,            0x0},
 5282         /* [19] l4_hdr over IPV4 over IPV4 */
 5283         {8,             0,              8,              12,
 5284         4,              0,              0,              0,              1,
 5285         0x1f,           0x0,            0x1f,           0x1e,
 5286         0x4,            0x0,            0x0,            0x0},
 5287         /* [20] IPV4 over IPV6 */
 5288         {11,            0,              8,              0,
 5289         4,              0,              0,              0,              1,
 5290         0x1f,           0x0,            0x1f,           0x1f,
 5291         0x4,            0x0,            0x0,            0x0},
 5292         /* [21] l4_hdr over IPV4 over IPV6 */
 5293         {11,            0,              8,              12,
 5294         4,              0,              0,              0,              1,
 5295         0x1f,           0x0,            0x1f,           0x1e,
 5296         0x4,            0x0,            0x0,            0x0},
 5297         /* [22] IPV6 over IPV4 */
 5298         {8,             0,              11,             0,
 5299         4,              0,              0,              0,              1,
 5300         0x1f,           0x0,            0x1f,           0x1f,
 5301         0x4,            0x0,            0x0,            0x0},
 5302         /* [23] l4_hdr over IPV6 over IPV4 */
 5303         {8,             0,              11,             12,
 5304         4,              0,              0,              0,              1,
 5305         0x1f,           0x0,            0x1f,           0x1e,
 5306         0x4,            0x0,            0x0,            0x0},
 5307         /* [24] IPV6 over IPV6 */
 5308         {11,            0,              11,             0,
 5309         4,              0,              0,              0,              1,
 5310         0x1f,           0x0,            0x1f,           0x1f,
 5311         0x4,            0x0,            0x0,            0x0},
 5312         /* [25] l4_hdr over IPV6 over IPV6 */
 5313         {11,            0,              11,             12,
 5314         4,              0,              0,              0,              1,
 5315         0x1f,           0x0,            0x1f,           0x1e,
 5316         0x4,            0x0,            0x0,            0x0},
 5317         /* [26] GENERIC_STORAGE_READ, over IPV4 (and udp) */
 5318         {8,             2,              0,              0,
 5319         0,              0,              0,              0,              1,
 5320         0x1f,           0x1f,           0x0,            0x0,
 5321         0x4,            0x0,            0x0,            0x0},
 5322         /* [27] GENERIC_STORAGE_READ, over IPV6 (and udp) */
 5323         {11,            2,              0,              0,
 5324         0,              0,              0,              0,              1,
 5325         0x1f,           0x1f,           0x0,            0x0,
 5326         0x4,            0x0,            0x0,            0x0},
 5327         /* [28] tunneled GENERIC_STORAGE_READ over IPV4 (and udp) over IPV4/IPV6 */
 5328         {8,             0,              8,              2,
 5329         4,              0,              0,              0,              1,
 5330         0x18,           0x0,            0x1f,           0x1f,
 5331         0x4,            0x0,            0x0,            0x0},
 5332         /* [29] tunneled GENERIC_STORAGE_READ over IPV6 (and udp)  over IPV4/IPV6 */
 5333         {8,             0,              11,             2,
 5334         4,              0,              0,              0,              1,
 5335         0x18,           0x0,            0x1f,           0x1f,
 5336         0x4,            0x0,            0x0,            0x0},
 5337         /* [30] tunneled L2 over GRE over IPV4 */
 5338         {8,             0,              0,              0,
 5339          4,             0,              0,              0,              1,
 5340          0x1f,          0x0,            0x1f,           0x0,
 5341          0x4,           0x0,            0x0,            0x0},
 5342         /* [31] default match */
 5343         {0,             0,              0,              0,
 5344          0,             0,              0,              0,              1,
 5345          0x0,           0x0,            0x0,            0x0,
 5346          0x0,           0x0,            0x0,            0x0}
 5347 };
 5348 
 5349 static struct al_eth_rx_gcp_table_entry
 5350 al_eth_generic_rx_crc_gcp[AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM] = {
 5351 
 5352         /* [0] roce (with grh, bth) */
 5353         {0,              1,             1,              0,              1,
 5354          0,             4,              8,              0,              1,
 5355          0,             0,              0,              0,              0,
 5356          0,             0,              {0xffff7f03,    0x00000000,     0x00000000,
 5357          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5358          0},
 5359         /* [1] fcoe */
 5360         {0,             1,              0,              0,              1,
 5361          0,             8,              14,             1,              1,
 5362          0,             0,              0,              0,              0,
 5363          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5364          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5365          0},
 5366         /* [2] routable_roce that is refered as l4_protocol, over IPV4 (and udp) */
 5367         {0,             1,              1,              0,              1,
 5368          0,             4,              0,              0,              1,
 5369          0,             0,              0,              0,              0,
 5370          0,             0,              {0x3000cf00,    0x00000f00,     0xc0000000,
 5371          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000011,
 5372          0},
 5373         /* [3] routable_roce that is refered as l4_protocol, over IPV6 (and udp) */
 5374         {0,             1,              1,              0,              1,
 5375          0,             4,              0,              0,              1,
 5376          0,             0,              0,              0,              0,
 5377          0,             0,              {0x7f030000,    0x00000000,     0x00000003,
 5378          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5379          0},
 5380         /* [4] routable_roce that is refered as tunneled_packet, over outer IPV4 and udp */
 5381         {0,             1,              1,              0,              1,
 5382          0,             4,              0,              0,              1,
 5383          2,             0,              0,              0,              10,
 5384          0,             0,              {0x3000cf00,    0x00000f00,     0xc0000000,
 5385          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x0302201c,
 5386          28},
 5387         /* [5] routable_roce that is refered as tunneled_packet, over outer IPV6 and udp */
 5388         {0,             1,              1,              0,              1,
 5389          0,             4,              0,              0,              1,
 5390          2,             0,              0,              0,              10,
 5391          0,             0,              {0x7f030000,    0x00000000,     0x00000003,
 5392          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x03002018,
 5393          48},
 5394         /* [6] tunneled roce (with grh, bth) over IPV4 */
 5395         {0,             1,              1,              0,              1,
 5396          0,             4,              8,              0,              1,
 5397          0,             0,              0,              1,              0,
 5398          0,             0,              {0xffff7f03,    0x00000000,     0x00000000,
 5399          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x03020014,
 5400          0},
 5401         /* [7] tunneled roce (with grh, bth) over IPV6 */
 5402         {0,             1,              1,              0,              1,
 5403          0,             4,              8,              0,              1,
 5404          0,             0,              0,              1,              0,
 5405          0,             0,              {0xffff7f03,    0x00000000,     0x00000000,
 5406          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5407          0},
 5408         /* [8] tunneled fcoe over IPV4 */
 5409         {0,             1,              0,              0,              1,
 5410          0,             8,              14,             1,              1,
 5411          0,             0,              0,              1,              0,
 5412          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5413          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03020014,
 5414          0},
 5415         /* [9] tunneled fcoe over IPV6 */
 5416         {0,             1,              0,              0,              1,
 5417          0,             8,              14,             1,              1,
 5418          0,             0,              0,              1,              0,
 5419          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5420          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5421          0},
 5422         /* [10] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV4 */
 5423         {0,             1,              1,              0,              1,
 5424          0,             4,              0,              0,              1,
 5425          0,             0,              0,              1,              0,
 5426          0,             0,              {0x3000cf00,    0x00000f00,     0xc0000000,
 5427          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03020015,
 5428          0},
 5429         /* [11] tunneled routable_roce that is refered as l4_protocol, over IPV4 (and udp) over IPV6 */
 5430         {0,             1,              1,              0,              1,
 5431          0,             4,              0,              0,              1,
 5432          0,             0,              0,              1,              0,
 5433          0,             0,              {0x3000cf00,    0x00000f00,     0xc0000000,
 5434          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000011,
 5435          0},
 5436         /* [12] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV4 */
 5437         {0,             1,              1,              0,              1,
 5438          0,             4,              0,              0,              1,
 5439          0,             0,              0,              1,              0,
 5440          0,             0,              {0x7f030000,    0x00000000,     0x00000003,
 5441          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x03020014,
 5442          0},
 5443         /* [13] tunneled routable_roce that is refered as l4_protocol, over IPV6 (and udp) over IPV6 */
 5444         {0,             1,              1,              0,              1,
 5445          0,             4,              0,              0,              1,
 5446          0,             0,              0,              1,              0,
 5447          0,             0,              {0x7f030000,    0x00000000,     0x00000003,
 5448          0x00c00000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5449          0},
 5450         /* [14] l3_pkt - IPV4 */
 5451         {0,             0,              0,              0,              0,
 5452          0,             0,              0,              0,              0,
 5453          0,             0,              0,              0,              0,
 5454          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5455          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000001,
 5456          0},
 5457         /* [15] l4_hdr over IPV4 */
 5458         {0,             0,              0,              0,              0,
 5459          0,             0,              0,              0,              0,
 5460          0,             0,              0,              0,              0,
 5461          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5462          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000003,
 5463          0},
 5464         /* [16] l3_pkt - IPV6 */
 5465         {0,             0,              0,              0,              0,
 5466          0,             0,              0,              0,              0,
 5467          0,             0,              0,              0,              0,
 5468          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5469          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000000,
 5470          0},
 5471         /* [17] l4_hdr over IPV6 */
 5472         {0,             0,              0,              0,              0,
 5473          0,             0,              0,              0,              0,
 5474          0,             0,              0,              0,              0,
 5475          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5476          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000002,
 5477          0},
 5478         /* [18] IPV4 over IPV4 */
 5479         {0,             0,              0,              0,              0,
 5480          0,             0,              0,              0,              0,
 5481          0,             0,              0,              0,              0,
 5482          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5483          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00020005,
 5484          0},
 5485         /* [19] l4_hdr over IPV4 over IPV4 */
 5486         {0,             0,              0,              0,              0,
 5487          0,             0,              0,              0,              0,
 5488          0,             0,              0,              0,              0,
 5489          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5490          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00020007,
 5491          0},
 5492         /* [20] IPV4 over IPV6 */
 5493         {0,             0,              0,              0,              0,
 5494          0,             0,              0,              0,              0,
 5495          0,             0,              0,              0,              0,
 5496          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5497          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000001,
 5498          0},
 5499         /* [21] l4_hdr over IPV4 over IPV6 */
 5500         {0,             0,              0,              0,              0,
 5501          0,             0,              0,              0,              0,
 5502          0,             0,              0,              0,              0,
 5503          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5504          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000003,
 5505          0},
 5506         /* [22] IPV6 over IPV4 */
 5507         {0,             0,              0,              0,              0,
 5508          0,             0,              0,              0,              0,
 5509          0,             0,              0,              0,              0,
 5510          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5511          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00020004,
 5512          0},
 5513         /* [23] l4_hdr over IPV6 over IPV4 */
 5514         {0,             0,              0,              0,              0,
 5515          0,             0,              0,              0,              0,
 5516          0,             0,              0,              0,              0,
 5517          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5518          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00020006,
 5519          0},
 5520         /* [24] IPV6 over IPV6 */
 5521         {0,             0,              0,              0,              0,
 5522          0,             0,              0,              0,              0,
 5523          0,             0,              0,              0,              0,
 5524          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5525          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000000,
 5526          0},
 5527         /* [25] l4_hdr over IPV6 over IPV6 */
 5528         {0,             0,              0,              0,              0,
 5529          0,             0,              0,              0,              0,
 5530          0,             0,              0,              0,              0,
 5531          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5532          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00000002,
 5533          0},
 5534         /* [26] GENERIC_STORAGE_READ, over IPV4 (and udp) */
 5535         {1,             1,              1,              0,              1,
 5536          0,             4,              0,              0,              1,
 5537          0,             0,              0,              2,              0,
 5538          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5539          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000011,
 5540          0},
 5541         /* [27] GENERIC_STORAGE_READ, over IPV6 (and udp) */
 5542         {1,             1,              1,              0,              1,
 5543          0,             4,              0,              0,              1,
 5544          0,             0,              0,              2,              0,
 5545          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5546          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5547          0},
 5548         /* [28] tunneled GENERIC_STORAGE_READ over IPV4 (and udp) over IPV4/IPV6 */
 5549         {1,             1,              1,              0,              1,
 5550          0,             4,              0,              0,              1,
 5551          0,             0,              0,              3,              0,
 5552          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5553          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000011,
 5554          0},
 5555         /* [29] tunneled GENERIC_STORAGE_READ over IPV6 (and udp)  over IPV4/IPV6 */
 5556         {1,             1,              1,              0,              1,
 5557          0,             4,              0,              0,              1,
 5558          0,             0,              0,              3,              0,
 5559          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5560          0x00000000,    0x00000000,     0x00000000},    0xffffffff,     0x03000010,
 5561          0},
 5562         /* [30] tunneled L2 over GRE over IPV4 */
 5563         {0,             0,              0,              0,              0,
 5564          0,             0,              0,              0,              0,
 5565          0,             0,              0,              0,              0,
 5566          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5567          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x00020004,
 5568          0},
 5569         /* [31] default match */
 5570         {0,             0,              0,              0,              0,
 5571          0,             0,              0,              0,              0,
 5572          0,             0,              0,              0,              0,
 5573          0,             0,              {0x00000000,    0x00000000,     0x00000000,
 5574          0x00000000,    0x00000000,     0x00000000},    0x00000000,     0x0,
 5575          0}
 5576 };
 5577 
 5578 int al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter)
 5579 {
 5580         int idx;
 5581         al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
 5582 
 5583         for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
 5584                 al_eth_tx_protocol_detect_table_entry_set(adapter, idx,
 5585                                 &al_eth_generic_tx_crc_gpd[idx]);
 5586 
 5587         return 0;
 5588 }
 5589 
 5590 int al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter *adapter)
 5591 {
 5592         int idx;
 5593         al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
 5594 
 5595         al_dbg("eth [%s]: enable tx_generic_crc\n", adapter->name);
 5596         al_reg_write32(&adapter->ec_regs_base->tfw_v3.tx_gcp_legacy, 0x0);
 5597         al_reg_write32(&adapter->ec_regs_base->tfw_v3.crc_csum_replace, 0x0);
 5598         for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
 5599                 al_eth_tx_generic_crc_table_entry_set(adapter, idx,
 5600                                 &al_eth_generic_tx_crc_gcp[idx]);
 5601 
 5602         return 0;
 5603 }
 5604 
 5605 int al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter *adapter)
 5606 {
 5607         int idx;
 5608         al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
 5609 
 5610         for (idx = 0; idx < AL_ETH_TX_GENERIC_CRC_ENTRIES_NUM; idx++)
 5611                 al_eth_tx_crc_chksum_replace_cmd_entry_set(adapter, idx,
 5612                                 &al_eth_tx_crc_chksum_replace_cmd[idx]);
 5613 
 5614         return 0;
 5615 }
 5616 
 5617 int al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter)
 5618 {
 5619         int idx;
 5620         al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
 5621         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p1,
 5622                         AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L3_PROTO_IDX_OFFSET);
 5623         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p2,
 5624                         AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_PROTO_IDX_OFFSET);
 5625         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p3,
 5626                         AL_ETH_RX_GPD_PARSE_RESULT_INNER_L3_PROTO_IDX_OFFSET);
 5627         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p4,
 5628                         AL_ETH_RX_GPD_PARSE_RESULT_INNER_L4_PROTO_IDX_OFFSET);
 5629         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p5,
 5630                         AL_ETH_RX_GPD_PARSE_RESULT_OUTER_PARSE_CTRL);
 5631         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p6,
 5632                         AL_ETH_RX_GPD_PARSE_RESULT_INNER_PARSE_CTRL);
 5633         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p7,
 5634                         AL_ETH_RX_GPD_PARSE_RESULT_L3_PRIORITY);
 5635         al_reg_write32(&adapter->ec_regs_base->rfw_v3.gpd_p8,
 5636                         AL_ETH_RX_GPD_PARSE_RESULT_OUTER_L4_DST_PORT_LSB);
 5637 
 5638         for (idx = 0; idx < AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM; idx++)
 5639                 al_eth_rx_protocol_detect_table_entry_set(adapter, idx,
 5640                                 &al_eth_generic_rx_crc_gpd[idx]);
 5641         return 0;
 5642 }
 5643 
 5644 int al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter *adapter)
 5645         {
 5646         int idx;
 5647         uint32_t val;
 5648 
 5649         al_assert((adapter->rev_id > AL_ETH_REV_ID_2));
 5650 
 5651         al_dbg("eth [%s]: enable rx_generic_crc\n", adapter->name);
 5652         al_reg_write32(&adapter->ec_regs_base->rfw_v3.rx_gcp_legacy, 0x0);
 5653 
 5654         for (idx = 0; idx < AL_ETH_RX_PROTOCOL_DETECT_ENTRIES_NUM; idx++)
 5655                 al_eth_rx_generic_crc_table_entry_set(adapter, idx,
 5656                                 &al_eth_generic_rx_crc_gcp[idx]);
 5657 
 5658         val = EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_15_CRC_RES_SEL |
 5659                         EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_14_L3_CKS_RES_SEL |
 5660                         EC_GEN_V3_RX_COMP_DESC_W3_DEC_STAT_13_L4_CKS_RES_SEL |
 5661                         EC_GEN_V3_RX_COMP_DESC_W0_L3_CKS_RES_SEL;
 5662         al_reg_write32_masked(&adapter->ec_regs_base->gen_v3.rx_comp_desc,
 5663                         val, val);
 5664         return 0;
 5665 }
 5666 
 5667 /** @} end of Ethernet group */
 5668 

Cache object: 0a909fdfb539334843979224bb433e3a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.