1*49b49cdaSZbigniew Bodek /*- 2*49b49cdaSZbigniew Bodek ******************************************************************************* 3*49b49cdaSZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd. 4*49b49cdaSZbigniew Bodek 5*49b49cdaSZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial 6*49b49cdaSZbigniew Bodek License Agreement. 7*49b49cdaSZbigniew Bodek 8*49b49cdaSZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General 9*49b49cdaSZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be 10*49b49cdaSZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html 11*49b49cdaSZbigniew Bodek 12*49b49cdaSZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or 13*49b49cdaSZbigniew Bodek without modification, are permitted provided that the following conditions are 14*49b49cdaSZbigniew Bodek met: 15*49b49cdaSZbigniew Bodek 16*49b49cdaSZbigniew Bodek * Redistributions of source code must retain the above copyright notice, 17*49b49cdaSZbigniew Bodek this list of conditions and the following disclaimer. 18*49b49cdaSZbigniew Bodek 19*49b49cdaSZbigniew Bodek * Redistributions in binary form must reproduce the above copyright 20*49b49cdaSZbigniew Bodek notice, this list of conditions and the following disclaimer in 21*49b49cdaSZbigniew Bodek the documentation and/or other materials provided with the 22*49b49cdaSZbigniew Bodek distribution. 23*49b49cdaSZbigniew Bodek 24*49b49cdaSZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 25*49b49cdaSZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26*49b49cdaSZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 27*49b49cdaSZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 28*49b49cdaSZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29*49b49cdaSZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30*49b49cdaSZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 31*49b49cdaSZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32*49b49cdaSZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33*49b49cdaSZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34*49b49cdaSZbigniew Bodek 35*49b49cdaSZbigniew Bodek *******************************************************************************/ 36*49b49cdaSZbigniew Bodek 37*49b49cdaSZbigniew Bodek /** 38*49b49cdaSZbigniew Bodek * @defgroup group_eth_api API 39*49b49cdaSZbigniew Bodek * Ethernet Controller HAL driver API 40*49b49cdaSZbigniew Bodek * @ingroup group_eth 41*49b49cdaSZbigniew Bodek * @{ 42*49b49cdaSZbigniew Bodek * @file al_hal_eth.h 43*49b49cdaSZbigniew Bodek * 44*49b49cdaSZbigniew Bodek * @brief Header file for Unified GbE and 10GbE Ethernet Controllers This is a 45*49b49cdaSZbigniew Bodek * common header file that covers both Standard and Advanced Controller 46*49b49cdaSZbigniew Bodek * 47*49b49cdaSZbigniew Bodek * 48*49b49cdaSZbigniew Bodek */ 49*49b49cdaSZbigniew Bodek 50*49b49cdaSZbigniew Bodek #ifndef __AL_HAL_ETH_H__ 51*49b49cdaSZbigniew Bodek #define __AL_HAL_ETH_H__ 52*49b49cdaSZbigniew Bodek 53*49b49cdaSZbigniew Bodek #include "al_hal_common.h" 54*49b49cdaSZbigniew Bodek #include "al_hal_udma.h" 55*49b49cdaSZbigniew Bodek #include "al_hal_eth_alu.h" 56*49b49cdaSZbigniew Bodek #ifdef AL_ETH_EX 57*49b49cdaSZbigniew Bodek #include "al_hal_eth_ex.h" 58*49b49cdaSZbigniew Bodek #include "al_hal_eth_ex_internal.h" 59*49b49cdaSZbigniew Bodek #endif 60*49b49cdaSZbigniew Bodek 61*49b49cdaSZbigniew Bodek /* *INDENT-OFF* */ 62*49b49cdaSZbigniew Bodek #ifdef __cplusplus 63*49b49cdaSZbigniew Bodek extern "C" { 64*49b49cdaSZbigniew Bodek #endif 65*49b49cdaSZbigniew Bodek /* *INDENT-ON* */ 66*49b49cdaSZbigniew Bodek 67*49b49cdaSZbigniew Bodek #ifndef AL_ETH_PKT_MAX_BUFS 68*49b49cdaSZbigniew Bodek #ifndef AL_ETH_EX 69*49b49cdaSZbigniew Bodek #define AL_ETH_PKT_MAX_BUFS 19 70*49b49cdaSZbigniew Bodek #else 71*49b49cdaSZbigniew Bodek #define AL_ETH_PKT_MAX_BUFS 29 72*49b49cdaSZbigniew Bodek #endif 73*49b49cdaSZbigniew Bodek #endif 74*49b49cdaSZbigniew Bodek 75*49b49cdaSZbigniew Bodek #define AL_ETH_UDMA_TX_QUEUES 4 76*49b49cdaSZbigniew Bodek #define AL_ETH_UDMA_RX_QUEUES 4 77*49b49cdaSZbigniew Bodek 78*49b49cdaSZbigniew Bodek /* PCI Adapter Device/Revision ID */ 79*49b49cdaSZbigniew Bodek #define AL_ETH_DEV_ID_STANDARD 0x0001 80*49b49cdaSZbigniew Bodek #define AL_ETH_DEV_ID_ADVANCED 0x0002 81*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_0 0 /* Alpine V1 Rev 0 */ 82*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_1 1 /* Alpine V1 Rev 1 */ 83*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_2 2 /* Alpine V2 basic */ 84*49b49cdaSZbigniew Bodek #define AL_ETH_REV_ID_3 3 /* Alpine V2 advanced */ 85*49b49cdaSZbigniew Bodek 86*49b49cdaSZbigniew Bodek /* PCI BARs */ 87*49b49cdaSZbigniew Bodek #define AL_ETH_UDMA_BAR 0 88*49b49cdaSZbigniew Bodek #define AL_ETH_EC_BAR 4 89*49b49cdaSZbigniew Bodek #define AL_ETH_MAC_BAR 2 90*49b49cdaSZbigniew Bodek 91*49b49cdaSZbigniew Bodek #define AL_ETH_MAX_FRAME_LEN 10000 92*49b49cdaSZbigniew Bodek #define AL_ETH_MIN_FRAME_LEN 60 93*49b49cdaSZbigniew Bodek 94*49b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MAX_IDX 8 95*49b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MIN_VAL 1 96*49b49cdaSZbigniew Bodek /*TODO: update with correct value*/ 97*49b49cdaSZbigniew Bodek #define AL_ETH_TSO_MSS_MAX_VAL (AL_ETH_MAX_FRAME_LEN - 200) 98*49b49cdaSZbigniew Bodek 99*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID { 100*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_UNKNOWN = 0, 101*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_IPv4 = 8, 102*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_IPv6 = 11, 103*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_TCP = 12, 104*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_UDP = 13, 105*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_FCOE = 21, 106*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_GRH = 22, /** RoCE l3 header */ 107*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_BTH = 23, /** RoCE l4 header */ 108*49b49cdaSZbigniew Bodek AL_ETH_PROTO_ID_ANY = 32, /**< for sw usage only */ 109*49b49cdaSZbigniew Bodek }; 110*49b49cdaSZbigniew Bodek #define AL_ETH_PROTOCOLS_NUM (AL_ETH_PROTO_ID_ANY) 111*49b49cdaSZbigniew Bodek 112*49b49cdaSZbigniew Bodek enum AL_ETH_TX_TUNNEL_MODE { 113*49b49cdaSZbigniew Bodek AL_ETH_NO_TUNNELING = 0, 114*49b49cdaSZbigniew Bodek AL_ETH_TUNNEL_NO_UDP = 1, /* NVGRE / IP over IP */ 115*49b49cdaSZbigniew Bodek AL_ETH_TUNNEL_WITH_UDP = 3, /* VXLAN */ 116*49b49cdaSZbigniew Bodek }; 117*49b49cdaSZbigniew Bodek 118*49b49cdaSZbigniew Bodek #define AL_ETH_RX_THASH_TABLE_SIZE (1 << 8) 119*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FSM_TABLE_SIZE (1 << 7) 120*49b49cdaSZbigniew Bodek #define AL_ETH_RX_CTRL_TABLE_SIZE (1 << 11) 121*49b49cdaSZbigniew Bodek #define AL_ETH_RX_HASH_KEY_NUM 10 122*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_MAC_NUM 32 123*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_MAC_HASH_NUM 256 124*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_PBITS_TABLE_NUM (1 << 3) 125*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_PRIO_TABLE_NUM (1 << 3) 126*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_VID_TABLE_NUM (1 << 12) 127*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_DSCP_TABLE_NUM (1 << 8) 128*49b49cdaSZbigniew Bodek #define AL_ETH_FWD_TC_TABLE_NUM (1 << 8) 129*49b49cdaSZbigniew Bodek 130*49b49cdaSZbigniew Bodek /** MAC media mode */ 131*49b49cdaSZbigniew Bodek enum al_eth_mac_mode { 132*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_RGMII, 133*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_SGMII, 134*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_SGMII_2_5G, 135*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_10GbE_Serial, /**< Applies to XFI and KR modes */ 136*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_10G_SGMII, /**< SGMII using the 10G MAC, don't use*/ 137*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_XLG_LL_40G, /**< applies to 40G mode using the 40G low latency (LL) MAC */ 138*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_KR_LL_25G, /**< applies to 25G mode using the 10/25G low latency (LL) MAC */ 139*49b49cdaSZbigniew Bodek AL_ETH_MAC_MODE_XLG_LL_50G /**< applies to 50G mode using the 40/50G low latency (LL) MAC */ 140*49b49cdaSZbigniew Bodek }; 141*49b49cdaSZbigniew Bodek 142*49b49cdaSZbigniew Bodek struct al_eth_capabilities { 143*49b49cdaSZbigniew Bodek al_bool speed_10_HD; 144*49b49cdaSZbigniew Bodek al_bool speed_10_FD; 145*49b49cdaSZbigniew Bodek al_bool speed_100_HD; 146*49b49cdaSZbigniew Bodek al_bool speed_100_FD; 147*49b49cdaSZbigniew Bodek al_bool speed_1000_HD; 148*49b49cdaSZbigniew Bodek al_bool speed_1000_FD; 149*49b49cdaSZbigniew Bodek al_bool speed_10000_HD; 150*49b49cdaSZbigniew Bodek al_bool speed_10000_FD; 151*49b49cdaSZbigniew Bodek al_bool pfc; /**< priority flow control */ 152*49b49cdaSZbigniew Bodek al_bool eee; /**< Energy Efficient Ethernet */ 153*49b49cdaSZbigniew Bodek }; 154*49b49cdaSZbigniew Bodek 155*49b49cdaSZbigniew Bodek /** interface type used for MDIO */ 156*49b49cdaSZbigniew Bodek enum al_eth_mdio_if { 157*49b49cdaSZbigniew Bodek AL_ETH_MDIO_IF_1G_MAC = 0, 158*49b49cdaSZbigniew Bodek AL_ETH_MDIO_IF_10G_MAC = 1 159*49b49cdaSZbigniew Bodek }; 160*49b49cdaSZbigniew Bodek 161*49b49cdaSZbigniew Bodek /** MDIO protocol type */ 162*49b49cdaSZbigniew Bodek enum al_eth_mdio_type { 163*49b49cdaSZbigniew Bodek AL_ETH_MDIO_TYPE_CLAUSE_22 = 0, 164*49b49cdaSZbigniew Bodek AL_ETH_MDIO_TYPE_CLAUSE_45 = 1 165*49b49cdaSZbigniew Bodek }; 166*49b49cdaSZbigniew Bodek 167*49b49cdaSZbigniew Bodek /** flow control mode */ 168*49b49cdaSZbigniew Bodek enum al_eth_flow_control_type { 169*49b49cdaSZbigniew Bodek AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE, 170*49b49cdaSZbigniew Bodek AL_ETH_FLOW_CONTROL_TYPE_PFC 171*49b49cdaSZbigniew Bodek }; 172*49b49cdaSZbigniew Bodek 173*49b49cdaSZbigniew Bodek /** Tx to Rx switching decision type */ 174*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_dec_type { 175*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_TYPE_MAC = 0, 176*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE = 1, 177*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_TYPE_VLAN_TABLE_AND_MAC = 2, 178*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_TYPE_BITMAP = 3 179*49b49cdaSZbigniew Bodek }; 180*49b49cdaSZbigniew Bodek 181*49b49cdaSZbigniew Bodek /** Tx to Rx VLAN ID selection type */ 182*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_vid_sel_type { 183*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN1 = 0, 184*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_VID_SEL_TYPE_VLAN2 = 1, 185*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN1 = 2, 186*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_VID_SEL_TYPE_NEW_VLAN2 = 3, 187*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_VID_SEL_TYPE_DEFAULT_VLAN1 = 4, 188*49b49cdaSZbigniew Bodek AL_ETH_TX_SWITCH_VID_SEL_TYPE_FINAL_VLAN1 = 5 189*49b49cdaSZbigniew Bodek }; 190*49b49cdaSZbigniew Bodek 191*49b49cdaSZbigniew Bodek /** Rx descriptor configurations */ 192*49b49cdaSZbigniew Bodek /* Note: when selecting rx descriptor field to inner packet, then that field 193*49b49cdaSZbigniew Bodek * will be set according to inner packet when packet is tunneled, for non-tunneled 194*49b49cdaSZbigniew Bodek * packets, the field will be set according to the packets header */ 195*49b49cdaSZbigniew Bodek 196*49b49cdaSZbigniew Bodek /** selection of the LRO_context_value result in the Metadata */ 197*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_lro_context_val_res { 198*49b49cdaSZbigniew Bodek AL_ETH_LRO_CONTEXT_VALUE = 0, /**< LRO_context_value */ 199*49b49cdaSZbigniew Bodek AL_ETH_L4_OFFSET = 1, /**< L4_offset */ 200*49b49cdaSZbigniew Bodek }; 201*49b49cdaSZbigniew Bodek 202*49b49cdaSZbigniew Bodek /** selection of the L4 offset in the Metadata */ 203*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_offset_sel { 204*49b49cdaSZbigniew Bodek AL_ETH_L4_OFFSET_OUTER = 0, /**< set L4 offset of the outer packet */ 205*49b49cdaSZbigniew Bodek AL_ETH_L4_OFFSET_INNER = 1, /**< set L4 offset of the inner packet */ 206*49b49cdaSZbigniew Bodek }; 207*49b49cdaSZbigniew Bodek 208*49b49cdaSZbigniew Bodek /** selection of the L4 checksum result in the Metadata */ 209*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_chk_res_sel { 210*49b49cdaSZbigniew Bodek AL_ETH_L4_INNER_CHK = 0, /**< L4 checksum */ 211*49b49cdaSZbigniew Bodek AL_ETH_L4_INNER_OUTER_CHK = 1, /**< Logic AND between outer and inner 212*49b49cdaSZbigniew Bodek L4 checksum result */ 213*49b49cdaSZbigniew Bodek }; 214*49b49cdaSZbigniew Bodek 215*49b49cdaSZbigniew Bodek /** selection of the L3 checksum result in the Metadata */ 216*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_chk_res_sel { 217*49b49cdaSZbigniew Bodek AL_ETH_L3_CHK_TYPE_0 = 0, /**< L3 checksum */ 218*49b49cdaSZbigniew Bodek AL_ETH_L3_CHK_TYPE_1 = 1, /**< L3 checksum or RoCE/FCoE CRC, 219*49b49cdaSZbigniew Bodek based on outer header */ 220*49b49cdaSZbigniew Bodek AL_ETH_L3_CHK_TYPE_2 = 2, /**< If tunnel exist = 0, 221*49b49cdaSZbigniew Bodek L3 checksum or RoCE/FCoE CRC, 222*49b49cdaSZbigniew Bodek based on outer header. 223*49b49cdaSZbigniew Bodek Else, 224*49b49cdaSZbigniew Bodek logic AND between outer L3 checksum 225*49b49cdaSZbigniew Bodek (Ipv4) and inner CRC (RoCE or FcoE) */ 226*49b49cdaSZbigniew Bodek AL_ETH_L3_CHK_TYPE_3 = 3, /**< combination of the L3 checksum result and 227*49b49cdaSZbigniew Bodek CRC result,based on the checksum and 228*49b49cdaSZbigniew Bodek RoCE/FCoE CRC input selections. */ 229*49b49cdaSZbigniew Bodek }; 230*49b49cdaSZbigniew Bodek 231*49b49cdaSZbigniew Bodek /** selection of the L3 protocol index in the Metadata */ 232*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_proto_idx_sel { 233*49b49cdaSZbigniew Bodek AL_ETH_L3_PROTO_IDX_OUTER = 0, /**< set L3 proto index of the outer packet */ 234*49b49cdaSZbigniew Bodek AL_ETH_L3_PROTO_IDX_INNER = 1, /**< set L3 proto index of the inner packet */ 235*49b49cdaSZbigniew Bodek }; 236*49b49cdaSZbigniew Bodek 237*49b49cdaSZbigniew Bodek /** selection of the L3 offset in the Metadata */ 238*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_offset_sel { 239*49b49cdaSZbigniew Bodek AL_ETH_L3_OFFSET_OUTER = 0, /**< set L3 offset of the outer packet */ 240*49b49cdaSZbigniew Bodek AL_ETH_L3_OFFSET_INNER = 1, /**< set L3 offset of the inner packet */ 241*49b49cdaSZbigniew Bodek }; 242*49b49cdaSZbigniew Bodek 243*49b49cdaSZbigniew Bodek 244*49b49cdaSZbigniew Bodek /** selection of the L4 protocol index in the Metadata */ 245*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_proto_idx_sel { 246*49b49cdaSZbigniew Bodek AL_ETH_L4_PROTO_IDX_OUTER = 0, /**< set L4 proto index of the outer packet */ 247*49b49cdaSZbigniew Bodek AL_ETH_L4_PROTO_IDX_INNER = 1, /**< set L4 proto index of the inner packet */ 248*49b49cdaSZbigniew Bodek }; 249*49b49cdaSZbigniew Bodek 250*49b49cdaSZbigniew Bodek /** selection of the frag indication in the Metadata */ 251*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_frag_sel { 252*49b49cdaSZbigniew Bodek AL_ETH_FRAG_OUTER = 0, /**< set frag of the outer packet */ 253*49b49cdaSZbigniew Bodek AL_ETH_FRAG_INNER = 1, /**< set frag of the inner packet */ 254*49b49cdaSZbigniew Bodek }; 255*49b49cdaSZbigniew Bodek 256*49b49cdaSZbigniew Bodek /** Ethernet Rx completion descriptor */ 257*49b49cdaSZbigniew Bodek typedef struct { 258*49b49cdaSZbigniew Bodek uint32_t ctrl_meta; 259*49b49cdaSZbigniew Bodek uint32_t len; 260*49b49cdaSZbigniew Bodek uint32_t word2; 261*49b49cdaSZbigniew Bodek uint32_t word3; 262*49b49cdaSZbigniew Bodek } al_eth_rx_cdesc; 263*49b49cdaSZbigniew Bodek 264*49b49cdaSZbigniew Bodek /** Flow Contol parameters */ 265*49b49cdaSZbigniew Bodek struct al_eth_flow_control_params{ 266*49b49cdaSZbigniew Bodek enum al_eth_flow_control_type type; /**< flow control type */ 267*49b49cdaSZbigniew Bodek al_bool obay_enable; /**< stop tx when pause received */ 268*49b49cdaSZbigniew Bodek al_bool gen_enable; /**< generate pause frames */ 269*49b49cdaSZbigniew Bodek uint16_t rx_fifo_th_high; 270*49b49cdaSZbigniew Bodek uint16_t rx_fifo_th_low; 271*49b49cdaSZbigniew Bodek uint16_t quanta; 272*49b49cdaSZbigniew Bodek uint16_t quanta_th; 273*49b49cdaSZbigniew Bodek uint8_t prio_q_map[4][8]; /**< for each UDMA, defines the mapping between 274*49b49cdaSZbigniew Bodek * PFC priority and queues(in bit mask). 275*49b49cdaSZbigniew Bodek * same mapping used for obay and generation. 276*49b49cdaSZbigniew Bodek * for example: 277*49b49cdaSZbigniew Bodek * if prio_q_map[1][7] = 0xC, then TX queues 2 278*49b49cdaSZbigniew Bodek * and 3 of UDMA 1 will be stopped when pause 279*49b49cdaSZbigniew Bodek * received with priority 7, also, when RX queues 280*49b49cdaSZbigniew Bodek * 2 and 3 of UDMA 1 become almost full, then 281*49b49cdaSZbigniew Bodek * pause frame with priority 7 will be sent. 282*49b49cdaSZbigniew Bodek * 283*49b49cdaSZbigniew Bodek *note: 284*49b49cdaSZbigniew Bodek * 1) if specific a queue is not used, the caller must 285*49b49cdaSZbigniew Bodek * make set the prio_q_map to 0 otherwise that queue 286*49b49cdaSZbigniew Bodek * will make the controller keep sending PAUSE packets. 287*49b49cdaSZbigniew Bodek * 2) queues of unused UDMA must be treated as above. 288*49b49cdaSZbigniew Bodek * 3) when working in LINK PAUSE mode, only entries at 289*49b49cdaSZbigniew Bodek * priority 0 will be considered. 290*49b49cdaSZbigniew Bodek */ 291*49b49cdaSZbigniew Bodek }; 292*49b49cdaSZbigniew Bodek 293*49b49cdaSZbigniew Bodek /* Packet Tx flags */ 294*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_TSO AL_BIT(7) /**< Enable TCP/UDP segmentation offloading */ 295*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_IPV4_L3_CSUM AL_BIT(13) /**< Enable IPv4 header checksum calculation */ 296*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L4_CSUM AL_BIT(14) /**< Enable TCP/UDP checksum calculation */ 297*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM AL_BIT(17) /**< L4 partial checksum calculation */ 298*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L2_MACSEC_PKT AL_BIT(16) /**< L2 Packet type 802_3 or 802_3_MACSEC, V2 */ 299*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_ENCRYPT AL_BIT(16) /**< Enable TX packet encryption, V3 */ 300*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_L2_DIS_FCS AL_BIT(15) /**< Disable CRC calculation*/ 301*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_TS AL_BIT(21) /**< Timestamp the packet */ 302*49b49cdaSZbigniew Bodek 303*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_INT AL_M2S_DESC_INT_EN 304*49b49cdaSZbigniew Bodek #define AL_ETH_TX_FLAGS_NO_SNOOP AL_M2S_DESC_NO_SNOOP_H 305*49b49cdaSZbigniew Bodek 306*49b49cdaSZbigniew Bodek /** this structure used for tx packet meta data */ 307*49b49cdaSZbigniew Bodek struct al_eth_meta_data{ 308*49b49cdaSZbigniew Bodek uint8_t store :1; /**< store the meta into the queues cache */ 309*49b49cdaSZbigniew Bodek uint8_t words_valid :4; /**< valid bit per word */ 310*49b49cdaSZbigniew Bodek 311*49b49cdaSZbigniew Bodek uint8_t vlan1_cfi_sel:2; 312*49b49cdaSZbigniew Bodek uint8_t vlan2_vid_sel:2; 313*49b49cdaSZbigniew Bodek uint8_t vlan2_cfi_sel:2; 314*49b49cdaSZbigniew Bodek uint8_t vlan2_pbits_sel:2; 315*49b49cdaSZbigniew Bodek uint8_t vlan2_ether_sel:2; 316*49b49cdaSZbigniew Bodek 317*49b49cdaSZbigniew Bodek uint16_t vlan1_new_vid:12; 318*49b49cdaSZbigniew Bodek uint8_t vlan1_new_cfi :1; 319*49b49cdaSZbigniew Bodek uint8_t vlan1_new_pbits :3; 320*49b49cdaSZbigniew Bodek uint16_t vlan2_new_vid:12; 321*49b49cdaSZbigniew Bodek uint8_t vlan2_new_cfi :1; 322*49b49cdaSZbigniew Bodek uint8_t vlan2_new_pbits :3; 323*49b49cdaSZbigniew Bodek 324*49b49cdaSZbigniew Bodek uint8_t l3_header_len; /**< in bytes */ 325*49b49cdaSZbigniew Bodek uint8_t l3_header_offset; 326*49b49cdaSZbigniew Bodek uint8_t l4_header_len; /**< in words(32-bits) */ 327*49b49cdaSZbigniew Bodek 328*49b49cdaSZbigniew Bodek /* rev 0 specific */ 329*49b49cdaSZbigniew Bodek uint8_t mss_idx_sel:3; /**< for TSO, select the register that holds the MSS */ 330*49b49cdaSZbigniew Bodek 331*49b49cdaSZbigniew Bodek /* rev 1 specific */ 332*49b49cdaSZbigniew Bodek uint8_t ts_index:4; /**< index of regiser where to store the tx timestamp */ 333*49b49cdaSZbigniew Bodek uint16_t mss_val :14; /**< for TSO, set the mss value */ 334*49b49cdaSZbigniew Bodek uint8_t outer_l3_offset; /**< for tunneling mode. up to 64 bytes */ 335*49b49cdaSZbigniew Bodek uint8_t outer_l3_len; /**< for tunneling mode. up to 128 bytes */ 336*49b49cdaSZbigniew Bodek }; 337*49b49cdaSZbigniew Bodek 338*49b49cdaSZbigniew Bodek /* Packet Rx flags when adding buffer to receive queue */ 339*49b49cdaSZbigniew Bodek 340*49b49cdaSZbigniew Bodek /**< 341*49b49cdaSZbigniew Bodek * VMID to be assigned to the packet descriptors 342*49b49cdaSZbigniew Bodek * Requires VMID in descriptor to be enabled for the specific UDMA 343*49b49cdaSZbigniew Bodek * queue. 344*49b49cdaSZbigniew Bodek */ 345*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_VMID_MASK AL_FIELD_MASK(15, 0) 346*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_NO_SNOOP AL_M2S_DESC_NO_SNOOP_H 347*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_INT AL_M2S_DESC_INT_EN 348*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_DUAL_BUF AL_BIT(31) 349*49b49cdaSZbigniew Bodek 350*49b49cdaSZbigniew Bodek /* Packet Rx flags set by HW when receiving packet */ 351*49b49cdaSZbigniew Bodek #define AL_ETH_RX_ERROR AL_BIT(16) /**< layer 2 errors (FCS, bad len, etc) */ 352*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_CSUM_ERR AL_BIT(14) 353*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L3_CSUM_ERR AL_BIT(13) 354*49b49cdaSZbigniew Bodek 355*49b49cdaSZbigniew Bodek /* Packet Rx flags - word 3 in Rx completion descriptor */ 356*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_CRC AL_BIT(31) 357*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L3_CSUM_2 AL_BIT(30) 358*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_CSUM_2 AL_BIT(29) 359*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_SW_SRC_PORT_SHIFT 13 360*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_SW_SRC_PORT_MASK AL_FIELD_MASK(15, 13) 361*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_SHIFT 3 362*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_LRO_CONTEXT_VAL_MASK AL_FIELD_MASK(10, 3) 363*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_OFFSET_SHIFT 3 364*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_L4_OFFSET_MASK AL_FIELD_MASK(10, 3) 365*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_PRIORITY_SHIFT 0 366*49b49cdaSZbigniew Bodek #define AL_ETH_RX_FLAGS_PRIORITY_MASK AL_FIELD_MASK(2, 0) 367*49b49cdaSZbigniew Bodek 368*49b49cdaSZbigniew Bodek /** packet structure. used for packet transmission and reception */ 369*49b49cdaSZbigniew Bodek struct al_eth_pkt{ 370*49b49cdaSZbigniew Bodek uint32_t flags; /**< see flags above, depends on context(tx or rx) */ 371*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID l3_proto_idx; 372*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID l4_proto_idx; 373*49b49cdaSZbigniew Bodek uint8_t source_vlan_count:2; 374*49b49cdaSZbigniew Bodek uint8_t vlan_mod_add_count:2; 375*49b49cdaSZbigniew Bodek uint8_t vlan_mod_del_count:2; 376*49b49cdaSZbigniew Bodek uint8_t vlan_mod_v1_ether_sel:2; 377*49b49cdaSZbigniew Bodek uint8_t vlan_mod_v1_vid_sel:2; 378*49b49cdaSZbigniew Bodek uint8_t vlan_mod_v1_pbits_sel:2; 379*49b49cdaSZbigniew Bodek 380*49b49cdaSZbigniew Bodek /* rev 1 specific */ 381*49b49cdaSZbigniew Bodek enum AL_ETH_TX_TUNNEL_MODE tunnel_mode; 382*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID outer_l3_proto_idx; /**< for tunneling mode */ 383*49b49cdaSZbigniew Bodek 384*49b49cdaSZbigniew Bodek /**< 385*49b49cdaSZbigniew Bodek * VMID to be assigned to the packet descriptors 386*49b49cdaSZbigniew Bodek * Requires VMID in descriptor to be enabled for the specific UDMA 387*49b49cdaSZbigniew Bodek * queue. 388*49b49cdaSZbigniew Bodek */ 389*49b49cdaSZbigniew Bodek uint16_t vmid; 390*49b49cdaSZbigniew Bodek 391*49b49cdaSZbigniew Bodek uint32_t rx_header_len; /**< header buffer length of rx packet, not used */ 392*49b49cdaSZbigniew Bodek struct al_eth_meta_data *meta; /**< if null, then no meta added */ 393*49b49cdaSZbigniew Bodek #ifdef AL_ETH_RX_DESC_RAW_GET 394*49b49cdaSZbigniew Bodek uint32_t rx_desc_raw[4]; 395*49b49cdaSZbigniew Bodek #endif 396*49b49cdaSZbigniew Bodek uint16_t rxhash; 397*49b49cdaSZbigniew Bodek uint16_t l3_offset; 398*49b49cdaSZbigniew Bodek 399*49b49cdaSZbigniew Bodek #ifdef AL_ETH_EX 400*49b49cdaSZbigniew Bodek struct al_eth_ext_metadata *ext_meta_data; 401*49b49cdaSZbigniew Bodek #endif 402*49b49cdaSZbigniew Bodek 403*49b49cdaSZbigniew Bodek uint8_t num_of_bufs; 404*49b49cdaSZbigniew Bodek struct al_buf bufs[AL_ETH_PKT_MAX_BUFS]; 405*49b49cdaSZbigniew Bodek }; 406*49b49cdaSZbigniew Bodek 407*49b49cdaSZbigniew Bodek struct al_ec_regs; 408*49b49cdaSZbigniew Bodek 409*49b49cdaSZbigniew Bodek 410*49b49cdaSZbigniew Bodek /** Ethernet Adapter private data structure used by this driver */ 411*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter{ 412*49b49cdaSZbigniew Bodek uint8_t rev_id; /**<PCI adapter revision ID */ 413*49b49cdaSZbigniew Bodek uint8_t udma_id; /**< the id of the UDMA used by this adapter */ 414*49b49cdaSZbigniew Bodek struct unit_regs __iomem * unit_regs; 415*49b49cdaSZbigniew Bodek void __iomem *udma_regs_base; 416*49b49cdaSZbigniew Bodek struct al_ec_regs __iomem *ec_regs_base; 417*49b49cdaSZbigniew Bodek void __iomem *ec_ints_base; 418*49b49cdaSZbigniew Bodek struct al_eth_mac_regs __iomem *mac_regs_base; 419*49b49cdaSZbigniew Bodek struct interrupt_controller_ctrl __iomem *mac_ints_base; 420*49b49cdaSZbigniew Bodek 421*49b49cdaSZbigniew Bodek char *name; /**< the upper layer must keep the string area */ 422*49b49cdaSZbigniew Bodek 423*49b49cdaSZbigniew Bodek struct al_udma tx_udma; 424*49b49cdaSZbigniew Bodek /* uint8_t tx_queues;*//* number of tx queues */ 425*49b49cdaSZbigniew Bodek struct al_udma rx_udma; 426*49b49cdaSZbigniew Bodek /* uint8_t rx_queues;*//* number of tx queues */ 427*49b49cdaSZbigniew Bodek 428*49b49cdaSZbigniew Bodek uint8_t enable_rx_parser; /**< config and enable rx parsing */ 429*49b49cdaSZbigniew Bodek 430*49b49cdaSZbigniew Bodek enum al_eth_flow_control_type fc_type; /**< flow control*/ 431*49b49cdaSZbigniew Bodek 432*49b49cdaSZbigniew Bodek enum al_eth_mac_mode mac_mode; 433*49b49cdaSZbigniew Bodek enum al_eth_mdio_if mdio_if; /**< which mac mdio interface to use */ 434*49b49cdaSZbigniew Bodek enum al_eth_mdio_type mdio_type; /**< mdio protocol type */ 435*49b49cdaSZbigniew Bodek al_bool shared_mdio_if; /**< when AL_TRUE, the mdio interface is shared with other controllers.*/ 436*49b49cdaSZbigniew Bodek uint8_t curr_lt_unit; 437*49b49cdaSZbigniew Bodek #ifdef AL_ETH_EX 438*49b49cdaSZbigniew Bodek struct al_eth_ex_state ex_state; 439*49b49cdaSZbigniew Bodek #endif 440*49b49cdaSZbigniew Bodek }; 441*49b49cdaSZbigniew Bodek 442*49b49cdaSZbigniew Bodek /** parameters from upper layer */ 443*49b49cdaSZbigniew Bodek struct al_eth_adapter_params{ 444*49b49cdaSZbigniew Bodek uint8_t rev_id; /**<PCI adapter revision ID */ 445*49b49cdaSZbigniew Bodek uint8_t udma_id; /**< the id of the UDMA used by this adapter */ 446*49b49cdaSZbigniew Bodek uint8_t enable_rx_parser; /**< when true, the rx epe parser will be enabled */ 447*49b49cdaSZbigniew Bodek void __iomem *udma_regs_base; /**< UDMA register base address */ 448*49b49cdaSZbigniew Bodek void __iomem *ec_regs_base; /**< Ethernet controller registers base address 449*49b49cdaSZbigniew Bodek * can be null if the function is virtual 450*49b49cdaSZbigniew Bodek */ 451*49b49cdaSZbigniew Bodek void __iomem *mac_regs_base; /**< Ethernet MAC registers base address 452*49b49cdaSZbigniew Bodek * can be null if the function is virtual 453*49b49cdaSZbigniew Bodek */ 454*49b49cdaSZbigniew Bodek char *name; /**< the upper layer must keep the string area */ 455*49b49cdaSZbigniew Bodek }; 456*49b49cdaSZbigniew Bodek 457*49b49cdaSZbigniew Bodek /* adapter management */ 458*49b49cdaSZbigniew Bodek /** 459*49b49cdaSZbigniew Bodek * initialize the ethernet adapter's DMA 460*49b49cdaSZbigniew Bodek * - initialize the adapter data structure 461*49b49cdaSZbigniew Bodek * - initialize the Tx and Rx UDMA 462*49b49cdaSZbigniew Bodek * - enable the Tx and Rx UDMA, the rings will be still disabled at this point. 463*49b49cdaSZbigniew Bodek * 464*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 465*49b49cdaSZbigniew Bodek * @param params the parameters passed from upper layer 466*49b49cdaSZbigniew Bodek * 467*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 468*49b49cdaSZbigniew Bodek */ 469*49b49cdaSZbigniew Bodek int al_eth_adapter_init(struct al_hal_eth_adapter *adapter, struct al_eth_adapter_params *params); 470*49b49cdaSZbigniew Bodek 471*49b49cdaSZbigniew Bodek /** 472*49b49cdaSZbigniew Bodek * stop the DMA of the ethernet adapter 473*49b49cdaSZbigniew Bodek * 474*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 475*49b49cdaSZbigniew Bodek * 476*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 477*49b49cdaSZbigniew Bodek */ 478*49b49cdaSZbigniew Bodek int al_eth_adapter_stop(struct al_hal_eth_adapter *adapter); 479*49b49cdaSZbigniew Bodek 480*49b49cdaSZbigniew Bodek int al_eth_adapter_reset(struct al_hal_eth_adapter *adapter); 481*49b49cdaSZbigniew Bodek 482*49b49cdaSZbigniew Bodek /** 483*49b49cdaSZbigniew Bodek * enable the ec and mac interrupts 484*49b49cdaSZbigniew Bodek * 485*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 486*49b49cdaSZbigniew Bodek * 487*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 488*49b49cdaSZbigniew Bodek */ 489*49b49cdaSZbigniew Bodek int al_eth_ec_mac_ints_config(struct al_hal_eth_adapter *adapter); 490*49b49cdaSZbigniew Bodek 491*49b49cdaSZbigniew Bodek /** 492*49b49cdaSZbigniew Bodek * ec and mac interrupt service routine 493*49b49cdaSZbigniew Bodek * read and print asserted interrupts 494*49b49cdaSZbigniew Bodek * 495*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 496*49b49cdaSZbigniew Bodek * 497*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 498*49b49cdaSZbigniew Bodek */ 499*49b49cdaSZbigniew Bodek int al_eth_ec_mac_isr(struct al_hal_eth_adapter *adapter); 500*49b49cdaSZbigniew Bodek 501*49b49cdaSZbigniew Bodek /* Q management */ 502*49b49cdaSZbigniew Bodek /** 503*49b49cdaSZbigniew Bodek * Configure and enable a queue ring 504*49b49cdaSZbigniew Bodek * 505*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 506*49b49cdaSZbigniew Bodek * @param type tx or rx 507*49b49cdaSZbigniew Bodek * @param qid queue index 508*49b49cdaSZbigniew Bodek * @param q_params queue parameters 509*49b49cdaSZbigniew Bodek * 510*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 511*49b49cdaSZbigniew Bodek */ 512*49b49cdaSZbigniew Bodek int al_eth_queue_config(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid, 513*49b49cdaSZbigniew Bodek struct al_udma_q_params *q_params); 514*49b49cdaSZbigniew Bodek 515*49b49cdaSZbigniew Bodek 516*49b49cdaSZbigniew Bodek /** 517*49b49cdaSZbigniew Bodek * enable a queue if it was previously disabled 518*49b49cdaSZbigniew Bodek * 519*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 520*49b49cdaSZbigniew Bodek * @param type tx or rx 521*49b49cdaSZbigniew Bodek * @param qid queue index 522*49b49cdaSZbigniew Bodek * 523*49b49cdaSZbigniew Bodek * @return -EPERM (not implemented yet). 524*49b49cdaSZbigniew Bodek */ 525*49b49cdaSZbigniew Bodek int al_eth_queue_enable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid); 526*49b49cdaSZbigniew Bodek 527*49b49cdaSZbigniew Bodek /** 528*49b49cdaSZbigniew Bodek * disable a queue 529*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 530*49b49cdaSZbigniew Bodek * @param type tx or rx 531*49b49cdaSZbigniew Bodek * @param qid queue index 532*49b49cdaSZbigniew Bodek * 533*49b49cdaSZbigniew Bodek * @return -EPERM (not implemented yet). 534*49b49cdaSZbigniew Bodek */ 535*49b49cdaSZbigniew Bodek int al_eth_queue_disable(struct al_hal_eth_adapter *adapter, enum al_udma_type type, uint32_t qid); 536*49b49cdaSZbigniew Bodek 537*49b49cdaSZbigniew Bodek /* MAC layer */ 538*49b49cdaSZbigniew Bodek 539*49b49cdaSZbigniew Bodek /** 540*49b49cdaSZbigniew Bodek * configure the mac media type. 541*49b49cdaSZbigniew Bodek * this function only sets the mode, but not the speed as certain mac modes 542*49b49cdaSZbigniew Bodek * support multiple speeds as will be negotiated by the link layer. 543*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 544*49b49cdaSZbigniew Bodek * @param mode media mode 545*49b49cdaSZbigniew Bodek * 546*49b49cdaSZbigniew Bodek * @return 0 on success. negative errno on failure. 547*49b49cdaSZbigniew Bodek */ 548*49b49cdaSZbigniew Bodek int al_eth_mac_config(struct al_hal_eth_adapter *adapter, enum al_eth_mac_mode mode); 549*49b49cdaSZbigniew Bodek 550*49b49cdaSZbigniew Bodek /** 551*49b49cdaSZbigniew Bodek * stop the mac tx and rx paths. 552*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 553*49b49cdaSZbigniew Bodek * 554*49b49cdaSZbigniew Bodek * @return 0 on success. negative error on failure. 555*49b49cdaSZbigniew Bodek */ 556*49b49cdaSZbigniew Bodek int al_eth_mac_stop(struct al_hal_eth_adapter *adapter); 557*49b49cdaSZbigniew Bodek 558*49b49cdaSZbigniew Bodek /** 559*49b49cdaSZbigniew Bodek * start the mac tx and rx paths. 560*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 561*49b49cdaSZbigniew Bodek * 562*49b49cdaSZbigniew Bodek * @return 0 on success. negative error on failure. 563*49b49cdaSZbigniew Bodek */ 564*49b49cdaSZbigniew Bodek int al_eth_mac_start(struct al_hal_eth_adapter *adapter); 565*49b49cdaSZbigniew Bodek 566*49b49cdaSZbigniew Bodek 567*49b49cdaSZbigniew Bodek /** 568*49b49cdaSZbigniew Bodek * get the adapter capabilities (speed, duplex,..) 569*49b49cdaSZbigniew Bodek * this function must not be called before configuring the mac mode using al_eth_mac_config() 570*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 571*49b49cdaSZbigniew Bodek * @param caps pointer to structure that will be updated by this function 572*49b49cdaSZbigniew Bodek * 573*49b49cdaSZbigniew Bodek * @return 0 on success. negative errno on failure. 574*49b49cdaSZbigniew Bodek */ 575*49b49cdaSZbigniew Bodek int al_eth_capabilities_get(struct al_hal_eth_adapter *adapter, struct al_eth_capabilities *caps); 576*49b49cdaSZbigniew Bodek 577*49b49cdaSZbigniew Bodek /** 578*49b49cdaSZbigniew Bodek * update link auto negotiation speed and duplex mode 579*49b49cdaSZbigniew Bodek * this function assumes the mac mode already set using the al_eth_mac_config() 580*49b49cdaSZbigniew Bodek * function. 581*49b49cdaSZbigniew Bodek * 582*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 583*49b49cdaSZbigniew Bodek * @param force_1000_base_x set to AL_TRUE to force the mac to work on 1000baseX 584*49b49cdaSZbigniew Bodek * (not relevant to RGMII) 585*49b49cdaSZbigniew Bodek * @param an_enable set to AL_TRUE to enable auto negotiation 586*49b49cdaSZbigniew Bodek * (not relevant to RGMII) 587*49b49cdaSZbigniew Bodek * @param speed in mega bits, e.g 1000 stands for 1Gbps (relevant only in case 588*49b49cdaSZbigniew Bodek * an_enable is AL_FALSE) 589*49b49cdaSZbigniew Bodek * @param full_duplex set to AL_TRUE to enable full duplex mode (relevant only 590*49b49cdaSZbigniew Bodek * in case an_enable is AL_FALSE) 591*49b49cdaSZbigniew Bodek * 592*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 593*49b49cdaSZbigniew Bodek */ 594*49b49cdaSZbigniew Bodek int al_eth_mac_link_config(struct al_hal_eth_adapter *adapter, 595*49b49cdaSZbigniew Bodek al_bool force_1000_base_x, 596*49b49cdaSZbigniew Bodek al_bool an_enable, 597*49b49cdaSZbigniew Bodek uint32_t speed, 598*49b49cdaSZbigniew Bodek al_bool full_duplex); 599*49b49cdaSZbigniew Bodek /** 600*49b49cdaSZbigniew Bodek * Enable/Disable Loopback mode 601*49b49cdaSZbigniew Bodek * 602*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 603*49b49cdaSZbigniew Bodek * @param enable set to AL_TRUE to enable full duplex mode 604*49b49cdaSZbigniew Bodek * 605*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 606*49b49cdaSZbigniew Bodek */ 607*49b49cdaSZbigniew Bodek int al_eth_mac_loopback_config(struct al_hal_eth_adapter *adapter, int enable); 608*49b49cdaSZbigniew Bodek 609*49b49cdaSZbigniew Bodek /** 610*49b49cdaSZbigniew Bodek * configure minimum and maximum rx packet length 611*49b49cdaSZbigniew Bodek * 612*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 613*49b49cdaSZbigniew Bodek * @param min_rx_len minimum rx packet length 614*49b49cdaSZbigniew Bodek * @param max_rx_len maximum rx packet length 615*49b49cdaSZbigniew Bodek * both length limits in bytes and it includes the MAC Layer header and FCS. 616*49b49cdaSZbigniew Bodek * @return 0 on success, otherwise on failure. 617*49b49cdaSZbigniew Bodek */ 618*49b49cdaSZbigniew Bodek int al_eth_rx_pkt_limit_config(struct al_hal_eth_adapter *adapter, uint32_t min_rx_len, uint32_t max_rx_len); 619*49b49cdaSZbigniew Bodek 620*49b49cdaSZbigniew Bodek 621*49b49cdaSZbigniew Bodek /* MDIO */ 622*49b49cdaSZbigniew Bodek 623*49b49cdaSZbigniew Bodek /* Reference clock frequency (platform specific) */ 624*49b49cdaSZbigniew Bodek enum al_eth_ref_clk_freq { 625*49b49cdaSZbigniew Bodek AL_ETH_REF_FREQ_375_MHZ = 0, 626*49b49cdaSZbigniew Bodek AL_ETH_REF_FREQ_187_5_MHZ = 1, 627*49b49cdaSZbigniew Bodek AL_ETH_REF_FREQ_250_MHZ = 2, 628*49b49cdaSZbigniew Bodek AL_ETH_REF_FREQ_500_MHZ = 3, 629*49b49cdaSZbigniew Bodek AL_ETH_REF_FREQ_428_MHZ = 4, 630*49b49cdaSZbigniew Bodek }; 631*49b49cdaSZbigniew Bodek 632*49b49cdaSZbigniew Bodek /** 633*49b49cdaSZbigniew Bodek * configure the MDIO hardware interface 634*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 635*49b49cdaSZbigniew Bodek * @param mdio_type clause type 636*49b49cdaSZbigniew Bodek * @param shared_mdio_if set to AL_TRUE if multiple controllers using the same 637*49b49cdaSZbigniew Bodek * @param ref_clk_freq reference clock frequency 638*49b49cdaSZbigniew Bodek * @param mdio_clk_freq_khz the required MDC/MDIO clock frequency [Khz] 639*49b49cdaSZbigniew Bodek * MDIO pins of the chip. 640*49b49cdaSZbigniew Bodek * 641*49b49cdaSZbigniew Bodek * @return 0 on success, otherwise on failure. 642*49b49cdaSZbigniew Bodek */ 643*49b49cdaSZbigniew Bodek int al_eth_mdio_config(struct al_hal_eth_adapter *adapter, 644*49b49cdaSZbigniew Bodek enum al_eth_mdio_type mdio_type, 645*49b49cdaSZbigniew Bodek al_bool shared_mdio_if, 646*49b49cdaSZbigniew Bodek enum al_eth_ref_clk_freq ref_clk_freq, 647*49b49cdaSZbigniew Bodek unsigned int mdio_clk_freq_khz); 648*49b49cdaSZbigniew Bodek 649*49b49cdaSZbigniew Bodek /** 650*49b49cdaSZbigniew Bodek * read mdio register 651*49b49cdaSZbigniew Bodek * this function uses polling mode, and as the mdio is slow interface, it might 652*49b49cdaSZbigniew Bodek * block the cpu for long time (milliseconds). 653*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 654*49b49cdaSZbigniew Bodek * @param phy_addr address of mdio phy 655*49b49cdaSZbigniew Bodek * @param device address of mdio device (used only in CLAUSE 45) 656*49b49cdaSZbigniew Bodek * @param reg index of the register 657*49b49cdaSZbigniew Bodek * @param val pointer for read value of the register 658*49b49cdaSZbigniew Bodek * 659*49b49cdaSZbigniew Bodek * @return 0 on success, negative errno on failure 660*49b49cdaSZbigniew Bodek */ 661*49b49cdaSZbigniew Bodek int al_eth_mdio_read(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, 662*49b49cdaSZbigniew Bodek uint32_t device, uint32_t reg, uint16_t *val); 663*49b49cdaSZbigniew Bodek 664*49b49cdaSZbigniew Bodek /** 665*49b49cdaSZbigniew Bodek * write mdio register 666*49b49cdaSZbigniew Bodek * this function uses polling mode, and as the mdio is slow interface, it might 667*49b49cdaSZbigniew Bodek * block the cpu for long time (milliseconds). 668*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 669*49b49cdaSZbigniew Bodek * @param phy_addr address of mdio phy 670*49b49cdaSZbigniew Bodek * @param device address of mdio device (used only in CLAUSE 45) 671*49b49cdaSZbigniew Bodek * @param reg index of the register 672*49b49cdaSZbigniew Bodek * @param val value to write 673*49b49cdaSZbigniew Bodek * 674*49b49cdaSZbigniew Bodek * @return 0 on success, negative errno on failure 675*49b49cdaSZbigniew Bodek */ 676*49b49cdaSZbigniew Bodek int al_eth_mdio_write(struct al_hal_eth_adapter *adapter, uint32_t phy_addr, 677*49b49cdaSZbigniew Bodek uint32_t device, uint32_t reg, uint16_t val); 678*49b49cdaSZbigniew Bodek 679*49b49cdaSZbigniew Bodek /* TX */ 680*49b49cdaSZbigniew Bodek /** 681*49b49cdaSZbigniew Bodek * get number of free tx descriptors 682*49b49cdaSZbigniew Bodek * 683*49b49cdaSZbigniew Bodek * @param adapter adapter handle 684*49b49cdaSZbigniew Bodek * @param qid queue index 685*49b49cdaSZbigniew Bodek * 686*49b49cdaSZbigniew Bodek * @return num of free descriptors. 687*49b49cdaSZbigniew Bodek */ 688*49b49cdaSZbigniew Bodek static INLINE uint32_t al_eth_tx_available_get(struct al_hal_eth_adapter *adapter, 689*49b49cdaSZbigniew Bodek uint32_t qid) 690*49b49cdaSZbigniew Bodek { 691*49b49cdaSZbigniew Bodek struct al_udma_q *udma_q; 692*49b49cdaSZbigniew Bodek 693*49b49cdaSZbigniew Bodek al_udma_q_handle_get(&adapter->tx_udma, qid, &udma_q); 694*49b49cdaSZbigniew Bodek 695*49b49cdaSZbigniew Bodek return al_udma_available_get(udma_q); 696*49b49cdaSZbigniew Bodek } 697*49b49cdaSZbigniew Bodek 698*49b49cdaSZbigniew Bodek /** 699*49b49cdaSZbigniew Bodek * prepare packet descriptors in tx queue. 700*49b49cdaSZbigniew Bodek * 701*49b49cdaSZbigniew Bodek * This functions prepares the descriptors for the given packet in the tx 702*49b49cdaSZbigniew Bodek * submission ring. the caller must call al_eth_tx_pkt_action() below 703*49b49cdaSZbigniew Bodek * in order to notify the hardware about the new descriptors. 704*49b49cdaSZbigniew Bodek * 705*49b49cdaSZbigniew Bodek * @param tx_dma_q pointer to UDMA tx queue 706*49b49cdaSZbigniew Bodek * @param pkt the packet to transmit 707*49b49cdaSZbigniew Bodek * 708*49b49cdaSZbigniew Bodek * @return number of descriptors used for this packet, 0 if no free 709*49b49cdaSZbigniew Bodek * room in the descriptors ring 710*49b49cdaSZbigniew Bodek */ 711*49b49cdaSZbigniew Bodek int al_eth_tx_pkt_prepare(struct al_udma_q *tx_dma_q, struct al_eth_pkt *pkt); 712*49b49cdaSZbigniew Bodek 713*49b49cdaSZbigniew Bodek 714*49b49cdaSZbigniew Bodek /** 715*49b49cdaSZbigniew Bodek * Trigger the DMA about previously added tx descriptors. 716*49b49cdaSZbigniew Bodek * 717*49b49cdaSZbigniew Bodek * @param tx_dma_q pointer to UDMA tx queue 718*49b49cdaSZbigniew Bodek * @param tx_descs number of descriptors to notify the DMA about. 719*49b49cdaSZbigniew Bodek * the tx_descs can be sum of descriptor numbers of multiple prepared packets, 720*49b49cdaSZbigniew Bodek * this way the caller can use this function to notify the DMA about multiple 721*49b49cdaSZbigniew Bodek * packets. 722*49b49cdaSZbigniew Bodek */ 723*49b49cdaSZbigniew Bodek void al_eth_tx_dma_action(struct al_udma_q *tx_dma_q, uint32_t tx_descs); 724*49b49cdaSZbigniew Bodek 725*49b49cdaSZbigniew Bodek /** 726*49b49cdaSZbigniew Bodek * get number of completed tx descriptors, upper layer should derive from 727*49b49cdaSZbigniew Bodek * this information which packets were completed. 728*49b49cdaSZbigniew Bodek * 729*49b49cdaSZbigniew Bodek * @param tx_dma_q pointer to UDMA tx queue 730*49b49cdaSZbigniew Bodek * 731*49b49cdaSZbigniew Bodek * @return number of completed tx descriptors. 732*49b49cdaSZbigniew Bodek */ 733*49b49cdaSZbigniew Bodek int al_eth_comp_tx_get(struct al_udma_q *tx_dma_q); 734*49b49cdaSZbigniew Bodek 735*49b49cdaSZbigniew Bodek /** 736*49b49cdaSZbigniew Bodek * configure a TSO MSS val 737*49b49cdaSZbigniew Bodek * 738*49b49cdaSZbigniew Bodek * the TSO MSS vals are preconfigured values for MSS stored in hardware and the 739*49b49cdaSZbigniew Bodek * packet could use them when not working in MSS explicit mode. 740*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 741*49b49cdaSZbigniew Bodek * @param idx the mss index 742*49b49cdaSZbigniew Bodek * @param mss_val the MSS value 743*49b49cdaSZbigniew Bodek * 744*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 745*49b49cdaSZbigniew Bodek */ 746*49b49cdaSZbigniew Bodek int al_eth_tso_mss_config(struct al_hal_eth_adapter *adapter, uint8_t idx, uint32_t mss_val); 747*49b49cdaSZbigniew Bodek 748*49b49cdaSZbigniew Bodek /* RX */ 749*49b49cdaSZbigniew Bodek /** 750*49b49cdaSZbigniew Bodek * Config the RX descriptor fields 751*49b49cdaSZbigniew Bodek * 752*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 753*49b49cdaSZbigniew Bodek * @param lro_sel select LRO context or l4 offset 754*49b49cdaSZbigniew Bodek * @param l4_offset_sel select l4 offset source 755*49b49cdaSZbigniew Bodek * @param l4_sel select the l4 checksum result 756*49b49cdaSZbigniew Bodek * @param l3_sel select the l3 checksum result 757*49b49cdaSZbigniew Bodek * @param l3_proto_sel select the l3 protocol index source 758*49b49cdaSZbigniew Bodek * @param l4_proto_sel select the l4 protocol index source 759*49b49cdaSZbigniew Bodek * @param frag_sel select the frag indication source 760*49b49cdaSZbigniew Bodek */ 761*49b49cdaSZbigniew Bodek void al_eth_rx_desc_config( 762*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter, 763*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_lro_context_val_res lro_sel, 764*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_offset_sel l4_offset_sel, 765*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_offset_sel l3_offset_sel, 766*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_chk_res_sel l4_sel, 767*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_chk_res_sel l3_sel, 768*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l3_proto_idx_sel l3_proto_sel, 769*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_l4_proto_idx_sel l4_proto_sel, 770*49b49cdaSZbigniew Bodek enum al_eth_rx_desc_frag_sel frag_sel); 771*49b49cdaSZbigniew Bodek 772*49b49cdaSZbigniew Bodek /** 773*49b49cdaSZbigniew Bodek * Configure RX header split 774*49b49cdaSZbigniew Bodek * 775*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 776*49b49cdaSZbigniew Bodek * @param enable header split when AL_TRUE 777*49b49cdaSZbigniew Bodek * @param header_split_len length in bytes of the header split, this value used when 778*49b49cdaSZbigniew Bodek * CTRL TABLE header split len select is set to 779*49b49cdaSZbigniew Bodek * AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_REG, in this case the controller will 780*49b49cdaSZbigniew Bodek * store the first header_split_len bytes into buf2, then the rest (if any) into buf1. 781*49b49cdaSZbigniew Bodek * when CTRL_TABLE header split len select set to other value, then the header_len 782*49b49cdaSZbigniew Bodek * determined according to the parser, and the header_split_len parameter is not 783*49b49cdaSZbigniew Bodek * used. 784*49b49cdaSZbigniew Bodek * 785*49b49cdaSZbigniew Bodek * return 0 on success. otherwise on failure. 786*49b49cdaSZbigniew Bodek */ 787*49b49cdaSZbigniew Bodek int al_eth_rx_header_split_config(struct al_hal_eth_adapter *adapter, al_bool enable, uint32_t header_len); 788*49b49cdaSZbigniew Bodek 789*49b49cdaSZbigniew Bodek /** 790*49b49cdaSZbigniew Bodek * enable / disable header split in the udma queue. 791*49b49cdaSZbigniew Bodek * length will be taken from the udma configuration to enable different length per queue. 792*49b49cdaSZbigniew Bodek * 793*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 794*49b49cdaSZbigniew Bodek * @param enable header split when AL_TRUE 795*49b49cdaSZbigniew Bodek * @param qid the queue id to enable/disable header split 796*49b49cdaSZbigniew Bodek * @param header_len in what len the udma will cut the header 797*49b49cdaSZbigniew Bodek * 798*49b49cdaSZbigniew Bodek * return 0 on success. 799*49b49cdaSZbigniew Bodek */ 800*49b49cdaSZbigniew Bodek int al_eth_rx_header_split_force_len_config(struct al_hal_eth_adapter *adapter, 801*49b49cdaSZbigniew Bodek al_bool enable, 802*49b49cdaSZbigniew Bodek uint32_t qid, 803*49b49cdaSZbigniew Bodek uint32_t header_len); 804*49b49cdaSZbigniew Bodek 805*49b49cdaSZbigniew Bodek /** 806*49b49cdaSZbigniew Bodek * add buffer to receive queue 807*49b49cdaSZbigniew Bodek * 808*49b49cdaSZbigniew Bodek * @param rx_dma_q pointer to UDMA rx queue 809*49b49cdaSZbigniew Bodek * @param buf pointer to data buffer 810*49b49cdaSZbigniew Bodek * @param flags bitwise of AL_ETH_RX_FLAGS 811*49b49cdaSZbigniew Bodek * @param header_buf this is not used for far and header_buf should be set to 812*49b49cdaSZbigniew Bodek * NULL. 813*49b49cdaSZbigniew Bodek * 814*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 815*49b49cdaSZbigniew Bodek */ 816*49b49cdaSZbigniew Bodek int al_eth_rx_buffer_add(struct al_udma_q *rx_dma_q, 817*49b49cdaSZbigniew Bodek struct al_buf *buf, uint32_t flags, 818*49b49cdaSZbigniew Bodek struct al_buf *header_buf); 819*49b49cdaSZbigniew Bodek 820*49b49cdaSZbigniew Bodek /** 821*49b49cdaSZbigniew Bodek * notify the hw engine about rx descriptors that were added to the receive queue 822*49b49cdaSZbigniew Bodek * 823*49b49cdaSZbigniew Bodek * @param rx_dma_q pointer to UDMA rx queue 824*49b49cdaSZbigniew Bodek * @param descs_num number of rx descriptors 825*49b49cdaSZbigniew Bodek */ 826*49b49cdaSZbigniew Bodek void al_eth_rx_buffer_action(struct al_udma_q *rx_dma_q, 827*49b49cdaSZbigniew Bodek uint32_t descs_num); 828*49b49cdaSZbigniew Bodek 829*49b49cdaSZbigniew Bodek /** 830*49b49cdaSZbigniew Bodek * get packet from RX completion ring 831*49b49cdaSZbigniew Bodek * 832*49b49cdaSZbigniew Bodek * @param rx_dma_q pointer to UDMA rx queue 833*49b49cdaSZbigniew Bodek * @param pkt pointer to a packet data structure, this function fills this 834*49b49cdaSZbigniew Bodek * structure with the information about the received packet. the buffers 835*49b49cdaSZbigniew Bodek * structures filled only with the length of the data written into the buffer, 836*49b49cdaSZbigniew Bodek * the address fields are not updated as the upper layer can retrieve this 837*49b49cdaSZbigniew Bodek * information by itself because the hardware uses the buffers in the same order 838*49b49cdaSZbigniew Bodek * were those buffers inserted into the ring of the receive queue. 839*49b49cdaSZbigniew Bodek * this structure should be allocated by the caller function. 840*49b49cdaSZbigniew Bodek * 841*49b49cdaSZbigniew Bodek * @return return number of descriptors or 0 if no completed packet found. 842*49b49cdaSZbigniew Bodek */ 843*49b49cdaSZbigniew Bodek uint32_t al_eth_pkt_rx(struct al_udma_q *rx_dma_q, struct al_eth_pkt *pkt); 844*49b49cdaSZbigniew Bodek 845*49b49cdaSZbigniew Bodek 846*49b49cdaSZbigniew Bodek /* RX parser table */ 847*49b49cdaSZbigniew Bodek struct al_eth_epe_p_reg_entry { 848*49b49cdaSZbigniew Bodek uint32_t data; 849*49b49cdaSZbigniew Bodek uint32_t mask; 850*49b49cdaSZbigniew Bodek uint32_t ctrl; 851*49b49cdaSZbigniew Bodek }; 852*49b49cdaSZbigniew Bodek 853*49b49cdaSZbigniew Bodek struct al_eth_epe_control_entry { 854*49b49cdaSZbigniew Bodek uint32_t data[6]; 855*49b49cdaSZbigniew Bodek }; 856*49b49cdaSZbigniew Bodek 857*49b49cdaSZbigniew Bodek /** 858*49b49cdaSZbigniew Bodek * update rx parser entry 859*49b49cdaSZbigniew Bodek * 860*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 861*49b49cdaSZbigniew Bodek * @param idx the protocol index to update 862*49b49cdaSZbigniew Bodek * @param reg_entry contents of parser register entry 863*49b49cdaSZbigniew Bodek * @param control entry contents of control table entry 864*49b49cdaSZbigniew Bodek * 865*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 866*49b49cdaSZbigniew Bodek */ 867*49b49cdaSZbigniew Bodek int al_eth_rx_parser_entry_update(struct al_hal_eth_adapter *adapter, uint32_t idx, 868*49b49cdaSZbigniew Bodek struct al_eth_epe_p_reg_entry *reg_entry, 869*49b49cdaSZbigniew Bodek struct al_eth_epe_control_entry *control_entry); 870*49b49cdaSZbigniew Bodek 871*49b49cdaSZbigniew Bodek /* Flow Steering and filtering */ 872*49b49cdaSZbigniew Bodek int al_eth_thash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma, uint32_t queue); 873*49b49cdaSZbigniew Bodek 874*49b49cdaSZbigniew Bodek /* FSM table bits */ 875*49b49cdaSZbigniew Bodek /** FSM table has 7 bits input address: 876*49b49cdaSZbigniew Bodek * bits[2:0] are the outer packet's type (IPv4, TCP...) 877*49b49cdaSZbigniew Bodek * bits[5:3] are the inner packet's type 878*49b49cdaSZbigniew Bodek * bit[6] is set when packet is tunneled. 879*49b49cdaSZbigniew Bodek * 880*49b49cdaSZbigniew Bodek * The output of each entry: 881*49b49cdaSZbigniew Bodek * bits[1:0] - input selection: selects the input for the thash (2/4 tuple, inner/outer) 882*49b49cdaSZbigniew Bodek * bit[2] - selects whether to use thash output, or default values for the queue and udma 883*49b49cdaSZbigniew Bodek * bits[6:3] default UDMA mask: the UDMAs to select when bit 2 above was unset 884*49b49cdaSZbigniew Bodek * bits[9:5] defualt queue: the queue index to select when bit 2 above was unset 885*49b49cdaSZbigniew Bodek */ 886*49b49cdaSZbigniew Bodek 887*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_TCP 0 888*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_UDP 1 889*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_TCP 2 890*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_UDP 3 891*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV6_NO_UDP_TCP 4 892*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_NO_UDP_TCP 5 893*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_IPV4_FRAGMENTED 6 894*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_NOT_IP 7 895*49b49cdaSZbigniew Bodek 896*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_OUTER(idx) ((idx) & 7) 897*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_INNER(idx) (((idx) >> 3) & 7) 898*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_ENTRY_TUNNELED(idx) (((idx) >> 6) & 1) 899*49b49cdaSZbigniew Bodek 900*49b49cdaSZbigniew Bodek /* FSM DATA format */ 901*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_OUTER_2_TUPLE 0 902*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_OUTER_4_TUPLE 1 903*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_INNER_2_TUPLE 2 904*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_INNER_4_TUPLE 3 905*49b49cdaSZbigniew Bodek 906*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_HASH_SEL (1 << 2) 907*49b49cdaSZbigniew Bodek 908*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_DEFAULT_Q_SHIFT 5 909*49b49cdaSZbigniew Bodek #define AL_ETH_FSM_DATA_DEFAULT_UDMA_SHIFT 3 910*49b49cdaSZbigniew Bodek 911*49b49cdaSZbigniew Bodek /* set fsm table entry */ 912*49b49cdaSZbigniew Bodek int al_eth_fsm_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry); 913*49b49cdaSZbigniew Bodek 914*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT { 915*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_0 = 0, 916*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_1 = 1, 917*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT_ANY = 2, 918*49b49cdaSZbigniew Bodek }; 919*49b49cdaSZbigniew Bodek 920*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_TUNNEL { 921*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_TUNNEL_NOT_EXIST = 0, 922*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_TUNNEL_EXIST = 1, 923*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_TUNNEL_ANY = 2, 924*49b49cdaSZbigniew Bodek }; 925*49b49cdaSZbigniew Bodek 926*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN { 927*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_VLAN_NOT_EXIST = 0, 928*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_VLAN_EXIST = 1, 929*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_VLAN_ANY = 2, 930*49b49cdaSZbigniew Bodek }; 931*49b49cdaSZbigniew Bodek 932*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE { 933*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_MAC_TABLE_NO_MATCH = 0, 934*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_MAC_TABLE_MATCH = 1, 935*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_MAC_TABLE_ANY = 2, 936*49b49cdaSZbigniew Bodek }; 937*49b49cdaSZbigniew Bodek 938*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE { 939*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_UC = 0, /**< unicast */ 940*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_MC = 1, /**< multicast */ 941*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_BC = 2, /**< broadcast */ 942*49b49cdaSZbigniew Bodek AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE_ANY = 4, /**< for sw usage */ 943*49b49cdaSZbigniew Bodek }; 944*49b49cdaSZbigniew Bodek 945*49b49cdaSZbigniew Bodek /** 946*49b49cdaSZbigniew Bodek * This structure defines the index or group of indeces within the control table. 947*49b49cdaSZbigniew Bodek * each field has special enum value (with _ANY postfix) that indicates all 948*49b49cdaSZbigniew Bodek * possible values of that field. 949*49b49cdaSZbigniew Bodek */ 950*49b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_index { 951*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN_TABLE_OUT vlan_table_out; 952*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_TUNNEL tunnel_exist; 953*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_VLAN vlan_exist; 954*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_TABLE mac_table_match; 955*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID protocol_id; 956*49b49cdaSZbigniew Bodek enum AL_ETH_FWD_CTRL_IDX_MAC_DA_TYPE mac_type; 957*49b49cdaSZbigniew Bodek }; 958*49b49cdaSZbigniew Bodek 959*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_PRIO_SEL { 960*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_PBITS_TABLE = 0, 961*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_DSCP_TABLE = 1, 962*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_TC_TABLE = 2, 963*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG1 = 3, 964*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG2 = 4, 965*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG3 = 5, 966*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG4 = 6, 967*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG5 = 7, 968*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG6 = 7, 969*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG7 = 9, 970*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_REG8 = 10, 971*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_3 = 11, 972*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_0 = 12, 973*49b49cdaSZbigniew Bodek }; 974*49b49cdaSZbigniew Bodek /** where to select the initial queue from */ 975*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1 { 976*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_PRIO_TABLE = 0, 977*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_THASH_TABLE = 1, 978*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MAC_TABLE = 2, 979*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_MHASH_TABLE = 3, 980*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG1 = 4, 981*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG2 = 5, 982*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG3 = 6, 983*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG4 = 7, 984*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_3 = 12, 985*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_1_VAL_0 = 13, 986*49b49cdaSZbigniew Bodek }; 987*49b49cdaSZbigniew Bodek 988*49b49cdaSZbigniew Bodek /** target queue will be built up from the priority and initial queue */ 989*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2 { 990*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_TABLE = 0, /**< target queue is the output of priority table */ 991*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO = 1, /**< target queue is the priority */ 992*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_2_PRIO_QUEUE = 2, /**< target queue is initial queue[0], priority[1] */ 993*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_QUEUE_SEL_2_NO_PRIO = 3, /**< target queue is the initial */ 994*49b49cdaSZbigniew Bodek }; 995*49b49cdaSZbigniew Bodek 996*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_UDMA_SEL { 997*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_TABLE = 0, 998*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_THASH_AND_VLAN = 1, 999*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_TABLE = 2, 1000*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_VLAN_AND_MAC = 3, 1001*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_TABLE = 4, 1002*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_AND_MHASH = 5, 1003*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_MHASH_TABLE = 6, 1004*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG1 = 7, 1005*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG2 = 8, 1006*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG3 = 9, 1007*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG4 = 10, 1008*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG5 = 11, 1009*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG6 = 12, 1010*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG7 = 13, 1011*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_REG8 = 14, 1012*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_UDMA_SEL_VAL_0 = 15, 1013*49b49cdaSZbigniew Bodek }; 1014*49b49cdaSZbigniew Bodek 1015*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL { 1016*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_0 = 0, 1017*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_REG = 1, /**< select header len from the hdr_split register (set by al_eth_rx_header_split_config())*/ 1018*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L3_OFFSET = 2, 1019*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_OUTER_L4_OFFSET = 3, 1020*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_TUNNEL_START_OFFSET = 4, 1021*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L3_OFFSET = 5, 1022*49b49cdaSZbigniew Bodek AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL_INNER_L4_OFFSET = 6, 1023*49b49cdaSZbigniew Bodek }; 1024*49b49cdaSZbigniew Bodek 1025*49b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_entry { 1026*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_PRIO_SEL prio_sel; 1027*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_1 queue_sel_1; /**< queue id source */ 1028*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_QUEUE_SEL_2 queue_sel_2; /**< mix queue id with priority */ 1029*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_UDMA_SEL udma_sel; 1030*49b49cdaSZbigniew Bodek enum AL_ETH_CTRL_TABLE_HDR_SPLIT_LEN_SEL hdr_split_len_sel; 1031*49b49cdaSZbigniew Bodek al_bool filter; /**< set to AL_TRUE to enable filtering */ 1032*49b49cdaSZbigniew Bodek }; 1033*49b49cdaSZbigniew Bodek /** 1034*49b49cdaSZbigniew Bodek * Configure default control table entry 1035*49b49cdaSZbigniew Bodek * 1036*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1037*49b49cdaSZbigniew Bodek * @param use_table set to AL_TRUE if control table is used, when set to AL_FALSE 1038*49b49cdaSZbigniew Bodek * then control table will be bypassed and the entry value will be used. 1039*49b49cdaSZbigniew Bodek * @param entry defines the value to be used when bypassing control table. 1040*49b49cdaSZbigniew Bodek * 1041*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1042*49b49cdaSZbigniew Bodek */ 1043*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_set(struct al_hal_eth_adapter *adapter, 1044*49b49cdaSZbigniew Bodek al_bool use_table, 1045*49b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_entry *entry); 1046*49b49cdaSZbigniew Bodek 1047*49b49cdaSZbigniew Bodek /** 1048*49b49cdaSZbigniew Bodek * Configure control table entry 1049*49b49cdaSZbigniew Bodek * 1050*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1051*49b49cdaSZbigniew Bodek * @param index the entry index within the control table. 1052*49b49cdaSZbigniew Bodek * @param entry the value to write to the control table entry 1053*49b49cdaSZbigniew Bodek * 1054*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1055*49b49cdaSZbigniew Bodek */ 1056*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_set(struct al_hal_eth_adapter *adapter, 1057*49b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_index *index, 1058*49b49cdaSZbigniew Bodek struct al_eth_fwd_ctrl_table_entry *entry); 1059*49b49cdaSZbigniew Bodek 1060*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t entry); 1061*49b49cdaSZbigniew Bodek int al_eth_ctrl_table_def_raw_set(struct al_hal_eth_adapter *adapter, uint32_t val); 1062*49b49cdaSZbigniew Bodek 1063*49b49cdaSZbigniew Bodek /** 1064*49b49cdaSZbigniew Bodek * Configure hash key initial registers 1065*49b49cdaSZbigniew Bodek * Those registers define the initial key values, those values used for 1066*49b49cdaSZbigniew Bodek * the THASH and MHASH hash functions. 1067*49b49cdaSZbigniew Bodek * 1068*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1069*49b49cdaSZbigniew Bodek * @param idx the register index 1070*49b49cdaSZbigniew Bodek * @param val the register value 1071*49b49cdaSZbigniew Bodek * 1072*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1073*49b49cdaSZbigniew Bodek */ 1074*49b49cdaSZbigniew Bodek int al_eth_hash_key_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t val); 1075*49b49cdaSZbigniew Bodek 1076*49b49cdaSZbigniew Bodek struct al_eth_fwd_mac_table_entry { 1077*49b49cdaSZbigniew Bodek uint8_t addr[6]; /**< byte 0 is the first byte seen on the wire */ 1078*49b49cdaSZbigniew Bodek uint8_t mask[6]; 1079*49b49cdaSZbigniew Bodek al_bool tx_valid; 1080*49b49cdaSZbigniew Bodek uint8_t tx_target; 1081*49b49cdaSZbigniew Bodek al_bool rx_valid; 1082*49b49cdaSZbigniew Bodek uint8_t udma_mask; /**< target udma */ 1083*49b49cdaSZbigniew Bodek uint8_t qid; /**< target queue */ 1084*49b49cdaSZbigniew Bodek al_bool filter; /**< set to AL_TRUE to enable filtering */ 1085*49b49cdaSZbigniew Bodek }; 1086*49b49cdaSZbigniew Bodek 1087*49b49cdaSZbigniew Bodek /** 1088*49b49cdaSZbigniew Bodek * Configure mac table entry 1089*49b49cdaSZbigniew Bodek * The HW traverse this table and looks for match from lowest index, 1090*49b49cdaSZbigniew Bodek * when the packets MAC DA & mask == addr, and the valid bit is set, then match occurs. 1091*49b49cdaSZbigniew Bodek * 1092*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1093*49b49cdaSZbigniew Bodek * @param idx the entry index within the mac table. 1094*49b49cdaSZbigniew Bodek * @param entry the contents of the MAC table entry 1095*49b49cdaSZbigniew Bodek * 1096*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1097*49b49cdaSZbigniew Bodek */ 1098*49b49cdaSZbigniew Bodek int al_eth_fwd_mac_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 1099*49b49cdaSZbigniew Bodek struct al_eth_fwd_mac_table_entry *entry); 1100*49b49cdaSZbigniew Bodek 1101*49b49cdaSZbigniew Bodek int al_eth_fwd_mac_addr_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 1102*49b49cdaSZbigniew Bodek uint32_t addr_lo, uint32_t addr_hi, uint32_t mask_lo, uint32_t mask_hi); 1103*49b49cdaSZbigniew Bodek int al_eth_fwd_mac_ctrl_raw_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint32_t ctrl); 1104*49b49cdaSZbigniew Bodek 1105*49b49cdaSZbigniew Bodek int al_eth_mac_addr_store(void * __iomem ec_base, uint32_t idx, uint8_t *addr); 1106*49b49cdaSZbigniew Bodek int al_eth_mac_addr_read(void * __iomem ec_base, uint32_t idx, uint8_t *addr); 1107*49b49cdaSZbigniew Bodek 1108*49b49cdaSZbigniew Bodek /** 1109*49b49cdaSZbigniew Bodek * Configure pbits table entry 1110*49b49cdaSZbigniew Bodek * The HW uses this table to translate between vlan pbits field to priority. 1111*49b49cdaSZbigniew Bodek * The vlan pbits is used as the index of this table. 1112*49b49cdaSZbigniew Bodek * 1113*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1114*49b49cdaSZbigniew Bodek * @param idx the entry index within the table. 1115*49b49cdaSZbigniew Bodek * @param prio the priority to set for this entry 1116*49b49cdaSZbigniew Bodek * 1117*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1118*49b49cdaSZbigniew Bodek */ 1119*49b49cdaSZbigniew Bodek int al_eth_fwd_pbits_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio); 1120*49b49cdaSZbigniew Bodek 1121*49b49cdaSZbigniew Bodek /** 1122*49b49cdaSZbigniew Bodek * Configure priority table entry 1123*49b49cdaSZbigniew Bodek * The HW uses this table to translate between priority to queue index. 1124*49b49cdaSZbigniew Bodek * The priority is used as the index of this table. 1125*49b49cdaSZbigniew Bodek * 1126*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1127*49b49cdaSZbigniew Bodek * @param prio the entry index within the table. 1128*49b49cdaSZbigniew Bodek * @param qid the queue index to set for this entry (priority). 1129*49b49cdaSZbigniew Bodek * 1130*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1131*49b49cdaSZbigniew Bodek */ 1132*49b49cdaSZbigniew Bodek int al_eth_fwd_priority_table_set(struct al_hal_eth_adapter *adapter, uint8_t prio, uint8_t qid); 1133*49b49cdaSZbigniew Bodek 1134*49b49cdaSZbigniew Bodek /** 1135*49b49cdaSZbigniew Bodek * Configure DSCP table entry 1136*49b49cdaSZbigniew Bodek * The HW uses this table to translate between IPv4 DSCP field to priority. 1137*49b49cdaSZbigniew Bodek * The IPv4 byte 1 (DSCP+ECN) used as index to this table. 1138*49b49cdaSZbigniew Bodek * 1139*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1140*49b49cdaSZbigniew Bodek * @param idx the entry index within the table. 1141*49b49cdaSZbigniew Bodek * @param prio the queue index to set for this entry (priority). 1142*49b49cdaSZbigniew Bodek * 1143*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1144*49b49cdaSZbigniew Bodek */ 1145*49b49cdaSZbigniew Bodek int al_eth_fwd_dscp_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio); 1146*49b49cdaSZbigniew Bodek 1147*49b49cdaSZbigniew Bodek /** 1148*49b49cdaSZbigniew Bodek * Configure TC table entry 1149*49b49cdaSZbigniew Bodek * The HW uses this table to translate between IPv6 TC field to priority. 1150*49b49cdaSZbigniew Bodek * The IPv6 TC used as index to this table. 1151*49b49cdaSZbigniew Bodek * 1152*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1153*49b49cdaSZbigniew Bodek * @param idx the entry index within the table. 1154*49b49cdaSZbigniew Bodek * @param prio the queue index to set for this entry (priority). 1155*49b49cdaSZbigniew Bodek * 1156*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1157*49b49cdaSZbigniew Bodek */ 1158*49b49cdaSZbigniew Bodek int al_eth_fwd_tc_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t prio); 1159*49b49cdaSZbigniew Bodek 1160*49b49cdaSZbigniew Bodek /** 1161*49b49cdaSZbigniew Bodek * Configure MAC HASH table entry 1162*49b49cdaSZbigniew Bodek * The HW uses 8 bits from the hash result on the MAC DA as index to this table. 1163*49b49cdaSZbigniew Bodek * 1164*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1165*49b49cdaSZbigniew Bodek * @param idx the entry index within the table. 1166*49b49cdaSZbigniew Bodek * @param udma_mask the target udma to set for this entry. 1167*49b49cdaSZbigniew Bodek * @param qid the target queue index to set for this entry. 1168*49b49cdaSZbigniew Bodek * 1169*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1170*49b49cdaSZbigniew Bodek */ 1171*49b49cdaSZbigniew Bodek int al_eth_fwd_mhash_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, uint8_t qid); 1172*49b49cdaSZbigniew Bodek 1173*49b49cdaSZbigniew Bodek struct al_eth_fwd_vid_table_entry { 1174*49b49cdaSZbigniew Bodek uint8_t control:1; /**< used as input for the control table */ 1175*49b49cdaSZbigniew Bodek uint8_t filter:1; /**< set to 1 to enable filtering */ 1176*49b49cdaSZbigniew Bodek uint8_t udma_mask:4; /**< target udmas */ 1177*49b49cdaSZbigniew Bodek }; 1178*49b49cdaSZbigniew Bodek 1179*49b49cdaSZbigniew Bodek /** 1180*49b49cdaSZbigniew Bodek * Configure default vlan table entry 1181*49b49cdaSZbigniew Bodek * 1182*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1183*49b49cdaSZbigniew Bodek * @param use_table set to AL_TRUE if vlan table is used, when set to AL_FALSE 1184*49b49cdaSZbigniew Bodek * then vid table will be bypassed and the default_entry value will be used. 1185*49b49cdaSZbigniew Bodek * @param default_entry defines the value to be used when bypassing vid table. 1186*49b49cdaSZbigniew Bodek * @param default_vlan defines the value will be used when untagget packet 1187*49b49cdaSZbigniew Bodek * received. this value will be used only for steering and filtering control, 1188*49b49cdaSZbigniew Bodek * the packet's data will not be changed. 1189*49b49cdaSZbigniew Bodek * 1190*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1191*49b49cdaSZbigniew Bodek */ 1192*49b49cdaSZbigniew Bodek int al_eth_fwd_vid_config_set(struct al_hal_eth_adapter *adapter, al_bool use_table, 1193*49b49cdaSZbigniew Bodek struct al_eth_fwd_vid_table_entry *default_entry, 1194*49b49cdaSZbigniew Bodek uint32_t default_vlan); 1195*49b49cdaSZbigniew Bodek /** 1196*49b49cdaSZbigniew Bodek * Configure vlan table entry 1197*49b49cdaSZbigniew Bodek * 1198*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1199*49b49cdaSZbigniew Bodek * @param idx the entry index within the vlan table. The HW uses the vlan id 1200*49b49cdaSZbigniew Bodek * field of the packet when accessing this table. 1201*49b49cdaSZbigniew Bodek * @param entry the value to write to the vlan table entry 1202*49b49cdaSZbigniew Bodek * 1203*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1204*49b49cdaSZbigniew Bodek */ 1205*49b49cdaSZbigniew Bodek int al_eth_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 1206*49b49cdaSZbigniew Bodek struct al_eth_fwd_vid_table_entry *entry); 1207*49b49cdaSZbigniew Bodek 1208*49b49cdaSZbigniew Bodek 1209*49b49cdaSZbigniew Bodek /** 1210*49b49cdaSZbigniew Bodek * Configure default UDMA register 1211*49b49cdaSZbigniew Bodek * When the control table entry udma selection set to AL_ETH_CTRL_TABLE_UDMA_SEL_REG<n>, 1212*49b49cdaSZbigniew Bodek * then the target UDMA will be set according to the register n of the default 1213*49b49cdaSZbigniew Bodek * UDMA registers. 1214*49b49cdaSZbigniew Bodek * 1215*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1216*49b49cdaSZbigniew Bodek * @param idx the index of the default register. 1217*49b49cdaSZbigniew Bodek * @param udma_mask the value of the register. 1218*49b49cdaSZbigniew Bodek * 1219*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1220*49b49cdaSZbigniew Bodek */ 1221*49b49cdaSZbigniew Bodek int al_eth_fwd_default_udma_config(struct al_hal_eth_adapter *adapter, uint32_t idx, 1222*49b49cdaSZbigniew Bodek uint8_t udma_mask); 1223*49b49cdaSZbigniew Bodek 1224*49b49cdaSZbigniew Bodek /** 1225*49b49cdaSZbigniew Bodek * Configure default queue register 1226*49b49cdaSZbigniew Bodek * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_QUEUE_SEL_1_REG<n>, 1227*49b49cdaSZbigniew Bodek * then the target queue will be set according to the register n of the default 1228*49b49cdaSZbigniew Bodek * queue registers. 1229*49b49cdaSZbigniew Bodek * 1230*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1231*49b49cdaSZbigniew Bodek * @param idx the index of the default register. 1232*49b49cdaSZbigniew Bodek * @param qid the value of the register. 1233*49b49cdaSZbigniew Bodek * 1234*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1235*49b49cdaSZbigniew Bodek */ 1236*49b49cdaSZbigniew Bodek int al_eth_fwd_default_queue_config(struct al_hal_eth_adapter *adapter, uint32_t idx, 1237*49b49cdaSZbigniew Bodek uint8_t qid); 1238*49b49cdaSZbigniew Bodek 1239*49b49cdaSZbigniew Bodek /** 1240*49b49cdaSZbigniew Bodek * Configure default priority register 1241*49b49cdaSZbigniew Bodek * When the control table entry queue selection 1 set to AL_ETH_CTRL_TABLE_PRIO_SEL_1_REG<n>, 1242*49b49cdaSZbigniew Bodek * then the target priority will be set according to the register n of the default 1243*49b49cdaSZbigniew Bodek * priority registers. 1244*49b49cdaSZbigniew Bodek * 1245*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1246*49b49cdaSZbigniew Bodek * @param idx the index of the default register. 1247*49b49cdaSZbigniew Bodek * @param prio the value of the register. 1248*49b49cdaSZbigniew Bodek * 1249*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1250*49b49cdaSZbigniew Bodek */ 1251*49b49cdaSZbigniew Bodek int al_eth_fwd_default_priority_config(struct al_hal_eth_adapter *adapter, uint32_t idx, 1252*49b49cdaSZbigniew Bodek uint8_t prio); 1253*49b49cdaSZbigniew Bodek 1254*49b49cdaSZbigniew Bodek 1255*49b49cdaSZbigniew Bodek 1256*49b49cdaSZbigniew Bodek /* filter undetected MAC DA */ 1257*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_UNDET_MAC (1 << 0) 1258*49b49cdaSZbigniew Bodek /* filter specific MAC DA based on MAC table output */ 1259*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_DET_MAC (1 << 1) 1260*49b49cdaSZbigniew Bodek /* filter all tagged */ 1261*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_TAGGED (1 << 2) 1262*49b49cdaSZbigniew Bodek /* filter all untagged */ 1263*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_UNTAGGED (1 << 3) 1264*49b49cdaSZbigniew Bodek /* filter all broadcast */ 1265*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_BC (1 << 4) 1266*49b49cdaSZbigniew Bodek /* filter all multicast */ 1267*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_MC (1 << 5) 1268*49b49cdaSZbigniew Bodek /* filter packet based on parser drop */ 1269*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_PARSE (1 << 6) 1270*49b49cdaSZbigniew Bodek /* filter packet based on VLAN table output */ 1271*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_VLAN_VID (1 << 7) 1272*49b49cdaSZbigniew Bodek /* filter packet based on control table output */ 1273*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_CTRL_TABLE (1 << 8) 1274*49b49cdaSZbigniew Bodek /* filter packet based on protocol index */ 1275*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_PROT_INDEX (1 << 9) 1276*49b49cdaSZbigniew Bodek /* filter packet based on WoL decision */ 1277*49b49cdaSZbigniew Bodek #define AL_ETH_RFW_FILTER_WOL (1 << 10) 1278*49b49cdaSZbigniew Bodek 1279*49b49cdaSZbigniew Bodek 1280*49b49cdaSZbigniew Bodek struct al_eth_filter_params { 1281*49b49cdaSZbigniew Bodek al_bool enable; 1282*49b49cdaSZbigniew Bodek uint32_t filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to enable */ 1283*49b49cdaSZbigniew Bodek al_bool filter_proto[AL_ETH_PROTOCOLS_NUM]; /**< set AL_TRUE for protocols to filter */ 1284*49b49cdaSZbigniew Bodek }; 1285*49b49cdaSZbigniew Bodek 1286*49b49cdaSZbigniew Bodek struct al_eth_filter_override_params { 1287*49b49cdaSZbigniew Bodek uint32_t filters; /**< bitmask of AL_ETH_RFW_FILTER.. for filters to override */ 1288*49b49cdaSZbigniew Bodek uint8_t udma; /**< target udma id */ 1289*49b49cdaSZbigniew Bodek uint8_t qid; /**< target queue id */ 1290*49b49cdaSZbigniew Bodek }; 1291*49b49cdaSZbigniew Bodek 1292*49b49cdaSZbigniew Bodek /** 1293*49b49cdaSZbigniew Bodek * Configure the receive filters 1294*49b49cdaSZbigniew Bodek * this function enables/disables filtering packets and which filtering 1295*49b49cdaSZbigniew Bodek * types to apply. 1296*49b49cdaSZbigniew Bodek * filters that indicated in tables (MAC table, VLAN and Control tables) 1297*49b49cdaSZbigniew Bodek * are not configured by this function. This functions only enables/disables 1298*49b49cdaSZbigniew Bodek * respecting the filter indication from those tables. 1299*49b49cdaSZbigniew Bodek * 1300*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1301*49b49cdaSZbigniew Bodek * @param params the parameters passed from upper layer 1302*49b49cdaSZbigniew Bodek * 1303*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1304*49b49cdaSZbigniew Bodek */ 1305*49b49cdaSZbigniew Bodek int al_eth_filter_config(struct al_hal_eth_adapter *adapter, struct al_eth_filter_params *params); 1306*49b49cdaSZbigniew Bodek 1307*49b49cdaSZbigniew Bodek /** 1308*49b49cdaSZbigniew Bodek * Configure the receive override filters 1309*49b49cdaSZbigniew Bodek * This function controls whither to force forwarding filtered packets 1310*49b49cdaSZbigniew Bodek * to a specific UDMA/queue. The override filters apply only for 1311*49b49cdaSZbigniew Bodek * filters that enabled by al_eth_filter_config(). 1312*49b49cdaSZbigniew Bodek * 1313*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 1314*49b49cdaSZbigniew Bodek * @param params override config parameters 1315*49b49cdaSZbigniew Bodek * 1316*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1317*49b49cdaSZbigniew Bodek */ 1318*49b49cdaSZbigniew Bodek int al_eth_filter_override_config(struct al_hal_eth_adapter *adapter, 1319*49b49cdaSZbigniew Bodek struct al_eth_filter_override_params *params); 1320*49b49cdaSZbigniew Bodek 1321*49b49cdaSZbigniew Bodek 1322*49b49cdaSZbigniew Bodek 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, 1323*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_vid_sel_type vid_sel_type, 1324*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_dec_type uc_dec, 1325*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_dec_type mc_dec, 1326*49b49cdaSZbigniew Bodek enum al_eth_tx_switch_dec_type bc_dec); 1327*49b49cdaSZbigniew Bodek int al_eth_switching_default_bitmap_set(struct al_hal_eth_adapter *adapter, uint8_t udma_id, uint8_t udma_uc_bitmask, 1328*49b49cdaSZbigniew Bodek uint8_t udma_mc_bitmask,uint8_t udma_bc_bitmask); 1329*49b49cdaSZbigniew Bodek int al_eth_flow_control_config(struct al_hal_eth_adapter *adapter, struct al_eth_flow_control_params *params); 1330*49b49cdaSZbigniew Bodek 1331*49b49cdaSZbigniew Bodek struct al_eth_eee_params{ 1332*49b49cdaSZbigniew Bodek uint8_t enable; 1333*49b49cdaSZbigniew Bodek uint32_t tx_eee_timer; /**< time in cycles the interface delays prior to entering eee state */ 1334*49b49cdaSZbigniew Bodek uint32_t min_interval; /**< minimum interval in cycles between two eee states */ 1335*49b49cdaSZbigniew Bodek uint32_t stop_cnt; /**< time in cycles to stop Tx mac i/f after getting out of eee state */ 1336*49b49cdaSZbigniew Bodek }; 1337*49b49cdaSZbigniew Bodek 1338*49b49cdaSZbigniew Bodek /** 1339*49b49cdaSZbigniew Bodek * configure EEE mode 1340*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1341*49b49cdaSZbigniew Bodek * @param params pointer to the eee input parameters. 1342*49b49cdaSZbigniew Bodek * 1343*49b49cdaSZbigniew Bodek * @return return 0 on success. otherwise on failure. 1344*49b49cdaSZbigniew Bodek */ 1345*49b49cdaSZbigniew Bodek int al_eth_eee_config(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params); 1346*49b49cdaSZbigniew Bodek 1347*49b49cdaSZbigniew Bodek /** 1348*49b49cdaSZbigniew Bodek * get EEE configuration 1349*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1350*49b49cdaSZbigniew Bodek * @param params pointer to the eee output parameters. 1351*49b49cdaSZbigniew Bodek * 1352*49b49cdaSZbigniew Bodek * @return return 0 on success. otherwise on failure. 1353*49b49cdaSZbigniew Bodek */ 1354*49b49cdaSZbigniew Bodek int al_eth_eee_get(struct al_hal_eth_adapter *adapter, struct al_eth_eee_params *params); 1355*49b49cdaSZbigniew Bodek 1356*49b49cdaSZbigniew Bodek 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); 1357*49b49cdaSZbigniew Bodek 1358*49b49cdaSZbigniew Bodek /* Timestamp 1359*49b49cdaSZbigniew Bodek * This is a generic time-stamp mechanism that can be used as generic to 1360*49b49cdaSZbigniew Bodek * time-stamp every received or transmit packet it can also support IEEE 1588v2 1361*49b49cdaSZbigniew Bodek * PTP time synchronization protocol. 1362*49b49cdaSZbigniew Bodek * In addition to time-stamp, an internal system time is maintained. For 1363*49b49cdaSZbigniew Bodek * further accuracy, the chip support transmit/receive clock synchronization 1364*49b49cdaSZbigniew Bodek * including recovery of master clock from one of the ports and distributing it 1365*49b49cdaSZbigniew Bodek * to the rest of the ports - that is outside the scope of the Ethernet 1366*49b49cdaSZbigniew Bodek * Controller - please refer to Annapurna Labs Alpine Hardware Wiki 1367*49b49cdaSZbigniew Bodek */ 1368*49b49cdaSZbigniew Bodek 1369*49b49cdaSZbigniew Bodek /* Timestamp management APIs */ 1370*49b49cdaSZbigniew Bodek 1371*49b49cdaSZbigniew Bodek /** 1372*49b49cdaSZbigniew Bodek * prepare the adapter for timestamping packets. 1373*49b49cdaSZbigniew Bodek * Rx timestamps requires using 8 words (8x4 bytes) rx completion descriptor 1374*49b49cdaSZbigniew Bodek * size as the timestamp value added into word 4. 1375*49b49cdaSZbigniew Bodek * 1376*49b49cdaSZbigniew Bodek * This function should be called after al_eth_mac_config() and before 1377*49b49cdaSZbigniew Bodek * enabling the queues. 1378*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1379*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1380*49b49cdaSZbigniew Bodek */ 1381*49b49cdaSZbigniew Bodek int al_eth_ts_init(struct al_hal_eth_adapter *adapter); 1382*49b49cdaSZbigniew Bodek 1383*49b49cdaSZbigniew Bodek /* Timestamp data path APIs */ 1384*49b49cdaSZbigniew Bodek 1385*49b49cdaSZbigniew Bodek /* 1386*49b49cdaSZbigniew Bodek * This is the size of the on-chip array that keeps the time-stamp of the 1387*49b49cdaSZbigniew Bodek * latest transmitted packets 1388*49b49cdaSZbigniew Bodek */ 1389*49b49cdaSZbigniew Bodek #define AL_ETH_PTH_TX_SAMPLES_NUM 16 1390*49b49cdaSZbigniew Bodek 1391*49b49cdaSZbigniew Bodek /** 1392*49b49cdaSZbigniew Bodek * read Timestamp sample value of previously transmitted packet. 1393*49b49cdaSZbigniew Bodek * 1394*49b49cdaSZbigniew Bodek * The adapter includes AL_ETH_PTH_TX_SAMPLES_NUM timestamp samples for tx 1395*49b49cdaSZbigniew Bodek * packets, those samples shared for all the UDMAs and queues. the al_eth_pkt 1396*49b49cdaSZbigniew Bodek * data structure includes the index of which sample to use for the packet 1397*49b49cdaSZbigniew Bodek * to transmit. It's the caller's responsibility to manage those samples, 1398*49b49cdaSZbigniew Bodek * for example, when using an index, the caller must make sure the packet 1399*49b49cdaSZbigniew Bodek * is completed and the tx time is sampled before using that index for 1400*49b49cdaSZbigniew Bodek * another packet. 1401*49b49cdaSZbigniew Bodek * 1402*49b49cdaSZbigniew Bodek * This function should be called after the completion indication of the 1403*49b49cdaSZbigniew Bodek * tx packet. however, there is a little chance that the timestamp sample 1404*49b49cdaSZbigniew Bodek * won't be updated yet, thus this function must be called again when it 1405*49b49cdaSZbigniew Bodek * returns -EAGAIN. 1406*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1407*49b49cdaSZbigniew Bodek * @param ts_index the index (out of 16) of the timestamp register 1408*49b49cdaSZbigniew Bodek * @param timestamp the timestamp value in 2^18 femtoseconds resolution. 1409*49b49cdaSZbigniew Bodek * @return -EAGAIN if the sample was not updated yet. 0 when the sample 1410*49b49cdaSZbigniew Bodek * was updated and no errors found. 1411*49b49cdaSZbigniew Bodek */ 1412*49b49cdaSZbigniew Bodek int al_eth_tx_ts_val_get(struct al_hal_eth_adapter *adapter, uint8_t ts_index, 1413*49b49cdaSZbigniew Bodek uint32_t *timestamp); 1414*49b49cdaSZbigniew Bodek 1415*49b49cdaSZbigniew Bodek /* Timestamp PTH (PTP Timestamp Handler) control and times management */ 1416*49b49cdaSZbigniew Bodek /** structure for describing PTH epoch time */ 1417*49b49cdaSZbigniew Bodek struct al_eth_pth_time { 1418*49b49cdaSZbigniew Bodek uint32_t seconds; /**< seconds */ 1419*49b49cdaSZbigniew Bodek uint64_t femto; /**< femto seconds */ 1420*49b49cdaSZbigniew Bodek }; 1421*49b49cdaSZbigniew Bodek 1422*49b49cdaSZbigniew Bodek /** 1423*49b49cdaSZbigniew Bodek * Read the systime value 1424*49b49cdaSZbigniew Bodek * This API should not be used to get the timestamp of packets. 1425*49b49cdaSZbigniew Bodek * The HW maintains 50 bits for the sub-seconds portion in femto resolution, 1426*49b49cdaSZbigniew Bodek * but this function reads only the 32 MSB bits since the LSB provides 1427*49b49cdaSZbigniew Bodek * sub-nanoseconds accuracy, which is not needed. 1428*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1429*49b49cdaSZbigniew Bodek * @param systime pointer to structure where the time will be stored. 1430*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1431*49b49cdaSZbigniew Bodek */ 1432*49b49cdaSZbigniew Bodek int al_eth_pth_systime_read(struct al_hal_eth_adapter *adapter, 1433*49b49cdaSZbigniew Bodek struct al_eth_pth_time *systime); 1434*49b49cdaSZbigniew Bodek 1435*49b49cdaSZbigniew Bodek /** 1436*49b49cdaSZbigniew Bodek * Set the clock period to a given value. 1437*49b49cdaSZbigniew Bodek * The systime will be incremented by this value on each posedge of the 1438*49b49cdaSZbigniew Bodek * adapters internal clock which driven by the SouthBridge clock. 1439*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1440*49b49cdaSZbigniew Bodek * @param clk_period the clock period in femto seconds. 1441*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1442*49b49cdaSZbigniew Bodek */ 1443*49b49cdaSZbigniew Bodek int al_eth_pth_clk_period_write(struct al_hal_eth_adapter *adapter, 1444*49b49cdaSZbigniew Bodek uint64_t clk_period); 1445*49b49cdaSZbigniew Bodek 1446*49b49cdaSZbigniew Bodek /**< enum for methods when updating systime using triggers */ 1447*49b49cdaSZbigniew Bodek enum al_eth_pth_update_method { 1448*49b49cdaSZbigniew Bodek AL_ETH_PTH_UPDATE_METHOD_SET = 0, /**< Set the time in int/ext update time */ 1449*49b49cdaSZbigniew Bodek AL_ETH_PTH_UPDATE_METHOD_INC = 1, /**< increment */ 1450*49b49cdaSZbigniew Bodek AL_ETH_PTH_UPDATE_METHOD_DEC = 2, /**< decrement */ 1451*49b49cdaSZbigniew Bodek AL_ETH_PTH_UPDATE_METHOD_ADD_TO_LAST = 3, /**< Set to last time + int/ext update time.*/ 1452*49b49cdaSZbigniew Bodek }; 1453*49b49cdaSZbigniew Bodek 1454*49b49cdaSZbigniew Bodek /**< systime internal update trigger types */ 1455*49b49cdaSZbigniew Bodek enum al_eth_pth_int_trig { 1456*49b49cdaSZbigniew Bodek AL_ETH_PTH_INT_TRIG_OUT_PULSE_0 = 0, /**< use output pulse as trigger */ 1457*49b49cdaSZbigniew Bodek AL_ETH_PTH_INT_TRIG_REG_WRITE = 1, /**< use the int update register 1458*49b49cdaSZbigniew Bodek * write as a trigger 1459*49b49cdaSZbigniew Bodek */ 1460*49b49cdaSZbigniew Bodek }; 1461*49b49cdaSZbigniew Bodek 1462*49b49cdaSZbigniew Bodek /**< parameters for internal trigger update */ 1463*49b49cdaSZbigniew Bodek struct al_eth_pth_int_update_params { 1464*49b49cdaSZbigniew Bodek al_bool enable; /**< enable internal trigger update */ 1465*49b49cdaSZbigniew Bodek enum al_eth_pth_update_method method; /**< internal trigger update 1466*49b49cdaSZbigniew Bodek * method 1467*49b49cdaSZbigniew Bodek */ 1468*49b49cdaSZbigniew Bodek enum al_eth_pth_int_trig trigger; /**< which internal trigger to 1469*49b49cdaSZbigniew Bodek * use 1470*49b49cdaSZbigniew Bodek */ 1471*49b49cdaSZbigniew Bodek }; 1472*49b49cdaSZbigniew Bodek 1473*49b49cdaSZbigniew Bodek /** 1474*49b49cdaSZbigniew Bodek * Configure the systime internal update 1475*49b49cdaSZbigniew Bodek * 1476*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1477*49b49cdaSZbigniew Bodek * @param params the configuration of the internal update. 1478*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1479*49b49cdaSZbigniew Bodek */ 1480*49b49cdaSZbigniew Bodek int al_eth_pth_int_update_config(struct al_hal_eth_adapter *adapter, 1481*49b49cdaSZbigniew Bodek struct al_eth_pth_int_update_params *params); 1482*49b49cdaSZbigniew Bodek 1483*49b49cdaSZbigniew Bodek /** 1484*49b49cdaSZbigniew Bodek * set internal update time 1485*49b49cdaSZbigniew Bodek * 1486*49b49cdaSZbigniew Bodek * The update time used when updating the systime with 1487*49b49cdaSZbigniew Bodek * internal update method. 1488*49b49cdaSZbigniew Bodek * 1489*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1490*49b49cdaSZbigniew Bodek * @param time the internal update time value 1491*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1492*49b49cdaSZbigniew Bodek */ 1493*49b49cdaSZbigniew Bodek int al_eth_pth_int_update_time_set(struct al_hal_eth_adapter *adapter, 1494*49b49cdaSZbigniew Bodek struct al_eth_pth_time *time); 1495*49b49cdaSZbigniew Bodek 1496*49b49cdaSZbigniew Bodek /**< parameters for external trigger update */ 1497*49b49cdaSZbigniew Bodek struct al_eth_pth_ext_update_params { 1498*49b49cdaSZbigniew Bodek uint8_t triggers; /**< bitmask of external triggers to enable */ 1499*49b49cdaSZbigniew Bodek enum al_eth_pth_update_method method; /**< external trigger update 1500*49b49cdaSZbigniew Bodek * method 1501*49b49cdaSZbigniew Bodek */ 1502*49b49cdaSZbigniew Bodek }; 1503*49b49cdaSZbigniew Bodek 1504*49b49cdaSZbigniew Bodek /** 1505*49b49cdaSZbigniew Bodek * Configure the systime external update. 1506*49b49cdaSZbigniew Bodek * external update triggered by external signals such as GPIO or pulses 1507*49b49cdaSZbigniew Bodek * from other eth controllers on the SoC. 1508*49b49cdaSZbigniew Bodek * 1509*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1510*49b49cdaSZbigniew Bodek * @param params the configuration of the external update. 1511*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1512*49b49cdaSZbigniew Bodek */ 1513*49b49cdaSZbigniew Bodek int al_eth_pth_ext_update_config(struct al_hal_eth_adapter *adapter, 1514*49b49cdaSZbigniew Bodek struct al_eth_pth_ext_update_params *params); 1515*49b49cdaSZbigniew Bodek 1516*49b49cdaSZbigniew Bodek /** 1517*49b49cdaSZbigniew Bodek * set external update time 1518*49b49cdaSZbigniew Bodek * 1519*49b49cdaSZbigniew Bodek * The update time used when updating the systime with 1520*49b49cdaSZbigniew Bodek * external update method. 1521*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1522*49b49cdaSZbigniew Bodek * @param time the external update time value 1523*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1524*49b49cdaSZbigniew Bodek */ 1525*49b49cdaSZbigniew Bodek int al_eth_pth_ext_update_time_set(struct al_hal_eth_adapter *adapter, 1526*49b49cdaSZbigniew Bodek struct al_eth_pth_time *time); 1527*49b49cdaSZbigniew Bodek /** 1528*49b49cdaSZbigniew Bodek * set the read compensation delay 1529*49b49cdaSZbigniew Bodek * 1530*49b49cdaSZbigniew Bodek * When reading the systime, the HW adds this value to compensate 1531*49b49cdaSZbigniew Bodek * read latency. 1532*49b49cdaSZbigniew Bodek * 1533*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1534*49b49cdaSZbigniew Bodek * @param subseconds the read latency delay in femto seconds. 1535*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1536*49b49cdaSZbigniew Bodek */ 1537*49b49cdaSZbigniew Bodek int al_eth_pth_read_compensation_set(struct al_hal_eth_adapter *adapter, 1538*49b49cdaSZbigniew Bodek uint64_t subseconds); 1539*49b49cdaSZbigniew Bodek /** 1540*49b49cdaSZbigniew Bodek * set the internal write compensation delay 1541*49b49cdaSZbigniew Bodek * 1542*49b49cdaSZbigniew Bodek * When updating the systime due to an internal trigger's event, the HW adds 1543*49b49cdaSZbigniew Bodek * this value to compensate latency. 1544*49b49cdaSZbigniew Bodek * 1545*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1546*49b49cdaSZbigniew Bodek * @param subseconds the write latency delay in femto seconds. 1547*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1548*49b49cdaSZbigniew Bodek */ 1549*49b49cdaSZbigniew Bodek int al_eth_pth_int_write_compensation_set(struct al_hal_eth_adapter *adapter, 1550*49b49cdaSZbigniew Bodek uint64_t subseconds); 1551*49b49cdaSZbigniew Bodek 1552*49b49cdaSZbigniew Bodek /** 1553*49b49cdaSZbigniew Bodek * set the external write compensation delay 1554*49b49cdaSZbigniew Bodek * 1555*49b49cdaSZbigniew Bodek * When updating the systime due to an external trigger's event, the HW adds 1556*49b49cdaSZbigniew Bodek * this value to compensate pulse propagation latency. 1557*49b49cdaSZbigniew Bodek * 1558*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1559*49b49cdaSZbigniew Bodek * @param subseconds the write latency delay in femto seconds. 1560*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1561*49b49cdaSZbigniew Bodek */ 1562*49b49cdaSZbigniew Bodek int al_eth_pth_ext_write_compensation_set(struct al_hal_eth_adapter *adapter, 1563*49b49cdaSZbigniew Bodek uint64_t subseconds); 1564*49b49cdaSZbigniew Bodek 1565*49b49cdaSZbigniew Bodek /** 1566*49b49cdaSZbigniew Bodek * set the sync compensation delay 1567*49b49cdaSZbigniew Bodek * 1568*49b49cdaSZbigniew Bodek * When the adapter passes systime from PTH to MAC to do the packets 1569*49b49cdaSZbigniew Bodek * timestamping, the sync compensation delay is added to systime value to 1570*49b49cdaSZbigniew Bodek * compensate the latency between the PTH and the MAC. 1571*49b49cdaSZbigniew Bodek * 1572*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1573*49b49cdaSZbigniew Bodek * @param subseconds the sync latency delay in femto seconds. 1574*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1575*49b49cdaSZbigniew Bodek */ 1576*49b49cdaSZbigniew Bodek int al_eth_pth_sync_compensation_set(struct al_hal_eth_adapter *adapter, 1577*49b49cdaSZbigniew Bodek uint64_t subseconds); 1578*49b49cdaSZbigniew Bodek 1579*49b49cdaSZbigniew Bodek #define AL_ETH_PTH_PULSE_OUT_NUM 8 1580*49b49cdaSZbigniew Bodek struct al_eth_pth_pulse_out_params { 1581*49b49cdaSZbigniew Bodek uint8_t index; /**< id of the pulse (0..7) */ 1582*49b49cdaSZbigniew Bodek al_bool enable; 1583*49b49cdaSZbigniew Bodek al_bool periodic; /**< when true, generate periodic pulse (PPS) */ 1584*49b49cdaSZbigniew Bodek uint8_t period_sec; /**< for periodic pulse, this is seconds 1585*49b49cdaSZbigniew Bodek * portion of the period time 1586*49b49cdaSZbigniew Bodek */ 1587*49b49cdaSZbigniew Bodek uint32_t period_us; /**< this is microseconds portion of the 1588*49b49cdaSZbigniew Bodek * period 1589*49b49cdaSZbigniew Bodek */ 1590*49b49cdaSZbigniew Bodek struct al_eth_pth_time start_time; /**< when to start pulse triggering */ 1591*49b49cdaSZbigniew Bodek uint64_t pulse_width; /**< pulse width in femto seconds */ 1592*49b49cdaSZbigniew Bodek }; 1593*49b49cdaSZbigniew Bodek 1594*49b49cdaSZbigniew Bodek /** 1595*49b49cdaSZbigniew Bodek * Configure an output pulse 1596*49b49cdaSZbigniew Bodek * This function configures an output pulse coming from the internal System 1597*49b49cdaSZbigniew Bodek * Time. This is typically a 1Hhz pulse that is used to synchronize the 1598*49b49cdaSZbigniew Bodek * rest of the components of the system. This API configure the Ethernet 1599*49b49cdaSZbigniew Bodek * Controller pulse. An additional set up is required to configure the chip 1600*49b49cdaSZbigniew Bodek * General Purpose I/O (GPIO) to enable the chip output pin. 1601*49b49cdaSZbigniew Bodek * 1602*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1603*49b49cdaSZbigniew Bodek * @param params output pulse configuration. 1604*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 1605*49b49cdaSZbigniew Bodek */ 1606*49b49cdaSZbigniew Bodek int al_eth_pth_pulse_out_config(struct al_hal_eth_adapter *adapter, 1607*49b49cdaSZbigniew Bodek struct al_eth_pth_pulse_out_params *params); 1608*49b49cdaSZbigniew Bodek 1609*49b49cdaSZbigniew Bodek /* link */ 1610*49b49cdaSZbigniew Bodek struct al_eth_link_status { 1611*49b49cdaSZbigniew Bodek al_bool link_up; 1612*49b49cdaSZbigniew Bodek }; 1613*49b49cdaSZbigniew Bodek 1614*49b49cdaSZbigniew Bodek /** 1615*49b49cdaSZbigniew Bodek * get link status 1616*49b49cdaSZbigniew Bodek * 1617*49b49cdaSZbigniew Bodek * this function should be used when no external phy is used to get 1618*49b49cdaSZbigniew Bodek * information about the link 1619*49b49cdaSZbigniew Bodek * 1620*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1621*49b49cdaSZbigniew Bodek * @param status pointer to struct where to set link information 1622*49b49cdaSZbigniew Bodek * 1623*49b49cdaSZbigniew Bodek * @return return 0 on success. otherwise on failure. 1624*49b49cdaSZbigniew Bodek */ 1625*49b49cdaSZbigniew Bodek int al_eth_link_status_get(struct al_hal_eth_adapter *adapter, struct al_eth_link_status *status); 1626*49b49cdaSZbigniew Bodek 1627*49b49cdaSZbigniew Bodek /** 1628*49b49cdaSZbigniew Bodek * Set LEDs to represent link status. 1629*49b49cdaSZbigniew Bodek * 1630*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1631*49b49cdaSZbigniew Bodek * @param link_is_up boolean indicating current link status. 1632*49b49cdaSZbigniew Bodek * In case link is down the leds will be turned off. 1633*49b49cdaSZbigniew Bodek * In case link is up the leds will be turned on, that means 1634*49b49cdaSZbigniew Bodek * leds will be blinking on traffic and will be constantly lighting 1635*49b49cdaSZbigniew Bodek * on inactive link 1636*49b49cdaSZbigniew Bodek * @return return 0 on success. otherwise on failure. 1637*49b49cdaSZbigniew Bodek */ 1638*49b49cdaSZbigniew Bodek int al_eth_led_set(struct al_hal_eth_adapter *adapter, al_bool link_is_up); 1639*49b49cdaSZbigniew Bodek 1640*49b49cdaSZbigniew Bodek /* get statistics */ 1641*49b49cdaSZbigniew Bodek 1642*49b49cdaSZbigniew Bodek struct al_eth_mac_stats{ 1643*49b49cdaSZbigniew Bodek /* sum the data and padding octets (i.e. without header and FCS) received with a valid frame. */ 1644*49b49cdaSZbigniew Bodek uint64_t aOctetsReceivedOK; 1645*49b49cdaSZbigniew Bodek /* sum of Payload and padding octets of frames transmitted without error*/ 1646*49b49cdaSZbigniew Bodek uint64_t aOctetsTransmittedOK; 1647*49b49cdaSZbigniew Bodek /* total number of packets received. Good and bad packets */ 1648*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts; 1649*49b49cdaSZbigniew Bodek /* number of received unicast packets */ 1650*49b49cdaSZbigniew Bodek uint32_t ifInUcastPkts; 1651*49b49cdaSZbigniew Bodek /* number of received multicast packets */ 1652*49b49cdaSZbigniew Bodek uint32_t ifInMulticastPkts; 1653*49b49cdaSZbigniew Bodek /* number of received broadcast packets */ 1654*49b49cdaSZbigniew Bodek uint32_t ifInBroadcastPkts; 1655*49b49cdaSZbigniew Bodek /* Number of frames received with FIFO Overflow, CRC, Payload Length, Jabber and Oversized, Alignment or PHY/PCS error indication */ 1656*49b49cdaSZbigniew Bodek uint32_t ifInErrors; 1657*49b49cdaSZbigniew Bodek 1658*49b49cdaSZbigniew Bodek /* number of transmitted unicast packets */ 1659*49b49cdaSZbigniew Bodek uint32_t ifOutUcastPkts; 1660*49b49cdaSZbigniew Bodek /* number of transmitted multicast packets */ 1661*49b49cdaSZbigniew Bodek uint32_t ifOutMulticastPkts; 1662*49b49cdaSZbigniew Bodek /* number of transmitted broadcast packets */ 1663*49b49cdaSZbigniew Bodek uint32_t ifOutBroadcastPkts; 1664*49b49cdaSZbigniew Bodek /* number of frames transmitted with FIFO Overflow, FIFO Underflow or Controller indicated error */ 1665*49b49cdaSZbigniew Bodek uint32_t ifOutErrors; 1666*49b49cdaSZbigniew Bodek 1667*49b49cdaSZbigniew Bodek /* number of Frame received without error (Including Pause Frames). */ 1668*49b49cdaSZbigniew Bodek uint32_t aFramesReceivedOK; 1669*49b49cdaSZbigniew Bodek /* number of Frames transmitter without error (Including Pause Frames) */ 1670*49b49cdaSZbigniew Bodek uint32_t aFramesTransmittedOK; 1671*49b49cdaSZbigniew Bodek /* number of packets received with less than 64 octets */ 1672*49b49cdaSZbigniew Bodek uint32_t etherStatsUndersizePkts; 1673*49b49cdaSZbigniew Bodek /* Too short frames with CRC error, available only for RGMII and 1G Serial modes */ 1674*49b49cdaSZbigniew Bodek uint32_t etherStatsFragments; 1675*49b49cdaSZbigniew Bodek /* Too long frames with CRC error */ 1676*49b49cdaSZbigniew Bodek uint32_t etherStatsJabbers; 1677*49b49cdaSZbigniew Bodek /* packet that exceeds the valid maximum programmed frame length */ 1678*49b49cdaSZbigniew Bodek uint32_t etherStatsOversizePkts; 1679*49b49cdaSZbigniew Bodek /* number of frames received with a CRC error */ 1680*49b49cdaSZbigniew Bodek uint32_t aFrameCheckSequenceErrors; 1681*49b49cdaSZbigniew Bodek /* number of frames received with alignment error */ 1682*49b49cdaSZbigniew Bodek uint32_t aAlignmentErrors; 1683*49b49cdaSZbigniew Bodek /* number of dropped packets due to FIFO overflow */ 1684*49b49cdaSZbigniew Bodek uint32_t etherStatsDropEvents; 1685*49b49cdaSZbigniew Bodek /* number of transmitted pause frames. */ 1686*49b49cdaSZbigniew Bodek uint32_t aPAUSEMACCtrlFramesTransmitted; 1687*49b49cdaSZbigniew Bodek /* number of received pause frames. */ 1688*49b49cdaSZbigniew Bodek uint32_t aPAUSEMACCtrlFramesReceived; 1689*49b49cdaSZbigniew Bodek /* frame received exceeded the maximum length programmed with register FRM_LGTH, available only for 10G modes */ 1690*49b49cdaSZbigniew Bodek uint32_t aFrameTooLongErrors; 1691*49b49cdaSZbigniew Bodek /* received frame with bad length/type (between 46 and 0x600 or less 1692*49b49cdaSZbigniew Bodek * than 46 for packets longer than 64), available only for 10G modes */ 1693*49b49cdaSZbigniew Bodek uint32_t aInRangeLengthErrors; 1694*49b49cdaSZbigniew Bodek /* Valid VLAN tagged frames transmitted */ 1695*49b49cdaSZbigniew Bodek uint32_t VLANTransmittedOK; 1696*49b49cdaSZbigniew Bodek /* Valid VLAN tagged frames received */ 1697*49b49cdaSZbigniew Bodek uint32_t VLANReceivedOK; 1698*49b49cdaSZbigniew Bodek /* Total number of octets received. Good and bad packets */ 1699*49b49cdaSZbigniew Bodek uint32_t etherStatsOctets; 1700*49b49cdaSZbigniew Bodek 1701*49b49cdaSZbigniew Bodek /* packets of 64 octets length is received (good and bad frames are counted) */ 1702*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts64Octets; 1703*49b49cdaSZbigniew Bodek /* Frames (good and bad) with 65 to 127 octets */ 1704*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts65to127Octets; 1705*49b49cdaSZbigniew Bodek /* Frames (good and bad) with 128 to 255 octets */ 1706*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts128to255Octets; 1707*49b49cdaSZbigniew Bodek /* Frames (good and bad) with 256 to 511 octets */ 1708*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts256to511Octets; 1709*49b49cdaSZbigniew Bodek /* Frames (good and bad) with 512 to 1023 octets */ 1710*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts512to1023Octets; 1711*49b49cdaSZbigniew Bodek /* Frames (good and bad) with 1024 to 1518 octets */ 1712*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts1024to1518Octets; 1713*49b49cdaSZbigniew Bodek /* frames with 1519 bytes to the maximum length programmed in the register FRAME_LENGTH. */ 1714*49b49cdaSZbigniew Bodek uint32_t etherStatsPkts1519toX; 1715*49b49cdaSZbigniew Bodek 1716*49b49cdaSZbigniew Bodek uint32_t eee_in; 1717*49b49cdaSZbigniew Bodek uint32_t eee_out; 1718*49b49cdaSZbigniew Bodek }; 1719*49b49cdaSZbigniew Bodek 1720*49b49cdaSZbigniew Bodek /** 1721*49b49cdaSZbigniew Bodek * get mac statistics 1722*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1723*49b49cdaSZbigniew Bodek * @param stats pointer to structure that will be filled with statistics. 1724*49b49cdaSZbigniew Bodek * 1725*49b49cdaSZbigniew Bodek * @return return 0 on success. otherwise on failure. 1726*49b49cdaSZbigniew Bodek */ 1727*49b49cdaSZbigniew Bodek int al_eth_mac_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_mac_stats *stats); 1728*49b49cdaSZbigniew Bodek 1729*49b49cdaSZbigniew Bodek struct al_eth_ec_stats{ 1730*49b49cdaSZbigniew Bodek /* Rx Frequency adjust FIFO input packets */ 1731*49b49cdaSZbigniew Bodek uint32_t faf_in_rx_pkt; 1732*49b49cdaSZbigniew Bodek /* Rx Frequency adjust FIFO input short error packets */ 1733*49b49cdaSZbigniew Bodek uint32_t faf_in_rx_short; 1734*49b49cdaSZbigniew Bodek /* Rx Frequency adjust FIFO input long error packets */ 1735*49b49cdaSZbigniew Bodek uint32_t faf_in_rx_long; 1736*49b49cdaSZbigniew Bodek /* Rx Frequency adjust FIFO output packets */ 1737*49b49cdaSZbigniew Bodek uint32_t faf_out_rx_pkt; 1738*49b49cdaSZbigniew Bodek /* Rx Frequency adjust FIFO output short error packets */ 1739*49b49cdaSZbigniew Bodek uint32_t faf_out_rx_short; 1740*49b49cdaSZbigniew Bodek /* Rx Frequency adjust FIFO output long error packets */ 1741*49b49cdaSZbigniew Bodek uint32_t faf_out_rx_long; 1742*49b49cdaSZbigniew Bodek /* Rx Frequency adjust FIFO output drop packets */ 1743*49b49cdaSZbigniew Bodek uint32_t faf_out_drop; 1744*49b49cdaSZbigniew Bodek /* Number of packets written into the Rx FIFO (without FIFO error indication) */ 1745*49b49cdaSZbigniew Bodek uint32_t rxf_in_rx_pkt; 1746*49b49cdaSZbigniew Bodek /* Number of error packets written into the Rx FIFO (with FIFO error indication, */ 1747*49b49cdaSZbigniew Bodek /* FIFO full indication during packet reception) */ 1748*49b49cdaSZbigniew Bodek uint32_t rxf_in_fifo_err; 1749*49b49cdaSZbigniew Bodek /* Number of packets read from Rx FIFO 1 */ 1750*49b49cdaSZbigniew Bodek uint32_t lbf_in_rx_pkt; 1751*49b49cdaSZbigniew Bodek /* Number of packets read from Rx FIFO 2 (loopback FIFO) */ 1752*49b49cdaSZbigniew Bodek uint32_t lbf_in_fifo_err; 1753*49b49cdaSZbigniew Bodek /* Rx FIFO output drop packets from FIFO 1 */ 1754*49b49cdaSZbigniew Bodek uint32_t rxf_out_rx_1_pkt; 1755*49b49cdaSZbigniew Bodek /* Rx FIFO output drop packets from FIFO 2 (loop back) */ 1756*49b49cdaSZbigniew Bodek uint32_t rxf_out_rx_2_pkt; 1757*49b49cdaSZbigniew Bodek /* Rx FIFO output drop packets from FIFO 1 */ 1758*49b49cdaSZbigniew Bodek uint32_t rxf_out_drop_1_pkt; 1759*49b49cdaSZbigniew Bodek /* Rx FIFO output drop packets from FIFO 2 (loop back) */ 1760*49b49cdaSZbigniew Bodek uint32_t rxf_out_drop_2_pkt; 1761*49b49cdaSZbigniew Bodek /* Rx Parser 1, input packet counter */ 1762*49b49cdaSZbigniew Bodek uint32_t rpe_1_in_rx_pkt; 1763*49b49cdaSZbigniew Bodek /* Rx Parser 1, output packet counter */ 1764*49b49cdaSZbigniew Bodek uint32_t rpe_1_out_rx_pkt; 1765*49b49cdaSZbigniew Bodek /* Rx Parser 2, input packet counter */ 1766*49b49cdaSZbigniew Bodek uint32_t rpe_2_in_rx_pkt; 1767*49b49cdaSZbigniew Bodek /* Rx Parser 2, output packet counter */ 1768*49b49cdaSZbigniew Bodek uint32_t rpe_2_out_rx_pkt; 1769*49b49cdaSZbigniew Bodek /* Rx Parser 3 (MACsec), input packet counter */ 1770*49b49cdaSZbigniew Bodek uint32_t rpe_3_in_rx_pkt; 1771*49b49cdaSZbigniew Bodek /* Rx Parser 3 (MACsec), output packet counter */ 1772*49b49cdaSZbigniew Bodek uint32_t rpe_3_out_rx_pkt; 1773*49b49cdaSZbigniew Bodek /* Tx parser, input packet counter */ 1774*49b49cdaSZbigniew Bodek uint32_t tpe_in_tx_pkt; 1775*49b49cdaSZbigniew Bodek /* Tx parser, output packet counter */ 1776*49b49cdaSZbigniew Bodek uint32_t tpe_out_tx_pkt; 1777*49b49cdaSZbigniew Bodek /* Tx packet modification, input packet counter */ 1778*49b49cdaSZbigniew Bodek uint32_t tpm_tx_pkt; 1779*49b49cdaSZbigniew Bodek /* Tx forwarding input packet counter */ 1780*49b49cdaSZbigniew Bodek uint32_t tfw_in_tx_pkt; 1781*49b49cdaSZbigniew Bodek /* Tx forwarding input packet counter */ 1782*49b49cdaSZbigniew Bodek uint32_t tfw_out_tx_pkt; 1783*49b49cdaSZbigniew Bodek /* Rx forwarding input packet counter */ 1784*49b49cdaSZbigniew Bodek uint32_t rfw_in_rx_pkt; 1785*49b49cdaSZbigniew Bodek /* Rx Forwarding, packet with VLAN command drop indication */ 1786*49b49cdaSZbigniew Bodek uint32_t rfw_in_vlan_drop; 1787*49b49cdaSZbigniew Bodek /* Rx Forwarding, packets with parse drop indication */ 1788*49b49cdaSZbigniew Bodek uint32_t rfw_in_parse_drop; 1789*49b49cdaSZbigniew Bodek /* Rx Forwarding, multicast packets */ 1790*49b49cdaSZbigniew Bodek uint32_t rfw_in_mc; 1791*49b49cdaSZbigniew Bodek /* Rx Forwarding, broadcast packets */ 1792*49b49cdaSZbigniew Bodek uint32_t rfw_in_bc; 1793*49b49cdaSZbigniew Bodek /* Rx Forwarding, tagged packets */ 1794*49b49cdaSZbigniew Bodek uint32_t rfw_in_vlan_exist; 1795*49b49cdaSZbigniew Bodek /* Rx Forwarding, untagged packets */ 1796*49b49cdaSZbigniew Bodek uint32_t rfw_in_vlan_nexist; 1797*49b49cdaSZbigniew Bodek /* Rx Forwarding, packets with MAC address drop indication (from the MAC address table) */ 1798*49b49cdaSZbigniew Bodek uint32_t rfw_in_mac_drop; 1799*49b49cdaSZbigniew Bodek /* Rx Forwarding, packets with undetected MAC address */ 1800*49b49cdaSZbigniew Bodek uint32_t rfw_in_mac_ndet_drop; 1801*49b49cdaSZbigniew Bodek /* Rx Forwarding, packets with drop indication from the control table */ 1802*49b49cdaSZbigniew Bodek uint32_t rfw_in_ctrl_drop; 1803*49b49cdaSZbigniew Bodek /* Rx Forwarding, packets with L3_protocol_index drop indication */ 1804*49b49cdaSZbigniew Bodek uint32_t rfw_in_prot_i_drop; 1805*49b49cdaSZbigniew Bodek /* EEE, number of times the system went into EEE state */ 1806*49b49cdaSZbigniew Bodek uint32_t eee_in; 1807*49b49cdaSZbigniew Bodek }; 1808*49b49cdaSZbigniew Bodek 1809*49b49cdaSZbigniew Bodek /** 1810*49b49cdaSZbigniew Bodek * get ec statistics 1811*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1812*49b49cdaSZbigniew Bodek * @param stats pointer to structure that will be filled with statistics. 1813*49b49cdaSZbigniew Bodek * 1814*49b49cdaSZbigniew Bodek * @return return 0 on success. otherwise on failure. 1815*49b49cdaSZbigniew Bodek */ 1816*49b49cdaSZbigniew Bodek int al_eth_ec_stats_get(struct al_hal_eth_adapter *adapter, struct al_eth_ec_stats *stats); 1817*49b49cdaSZbigniew Bodek 1818*49b49cdaSZbigniew Bodek struct al_eth_ec_stat_udma{ 1819*49b49cdaSZbigniew Bodek /* Rx forwarding output packet counter */ 1820*49b49cdaSZbigniew Bodek uint32_t rfw_out_rx_pkt; 1821*49b49cdaSZbigniew Bodek /* Rx forwarding output drop packet counter */ 1822*49b49cdaSZbigniew Bodek uint32_t rfw_out_drop; 1823*49b49cdaSZbigniew Bodek /* Multi-stream write, number of Rx packets */ 1824*49b49cdaSZbigniew Bodek uint32_t msw_in_rx_pkt; 1825*49b49cdaSZbigniew Bodek /* Multi-stream write, number of dropped packets at SOP, Q full indication */ 1826*49b49cdaSZbigniew Bodek uint32_t msw_drop_q_full; 1827*49b49cdaSZbigniew Bodek /* Multi-stream write, number of dropped packets at SOP */ 1828*49b49cdaSZbigniew Bodek uint32_t msw_drop_sop; 1829*49b49cdaSZbigniew Bodek /* Multi-stream write, number of dropped packets at EOP, */ 1830*49b49cdaSZbigniew Bodek /*EOP was written with error indication (not all packet data was written) */ 1831*49b49cdaSZbigniew Bodek uint32_t msw_drop_eop; 1832*49b49cdaSZbigniew Bodek /* Multi-stream write, number of packets written to the stream FIFO with EOP and without packet loss */ 1833*49b49cdaSZbigniew Bodek uint32_t msw_wr_eop; 1834*49b49cdaSZbigniew Bodek /* Multi-stream write, number of packets read from the FIFO into the stream */ 1835*49b49cdaSZbigniew Bodek uint32_t msw_out_rx_pkt; 1836*49b49cdaSZbigniew Bodek /* Number of transmitted packets without TSO enabled */ 1837*49b49cdaSZbigniew Bodek uint32_t tso_no_tso_pkt; 1838*49b49cdaSZbigniew Bodek /* Number of transmitted packets with TSO enabled */ 1839*49b49cdaSZbigniew Bodek uint32_t tso_tso_pkt; 1840*49b49cdaSZbigniew Bodek /* Number of TSO segments that were generated */ 1841*49b49cdaSZbigniew Bodek uint32_t tso_seg_pkt; 1842*49b49cdaSZbigniew Bodek /* Number of TSO segments that required padding */ 1843*49b49cdaSZbigniew Bodek uint32_t tso_pad_pkt; 1844*49b49cdaSZbigniew Bodek /* Tx Packet modification, MAC SA spoof error */ 1845*49b49cdaSZbigniew Bodek uint32_t tpm_tx_spoof; 1846*49b49cdaSZbigniew Bodek /* Tx MAC interface, input packet counter */ 1847*49b49cdaSZbigniew Bodek uint32_t tmi_in_tx_pkt; 1848*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of packets forwarded to the MAC */ 1849*49b49cdaSZbigniew Bodek uint32_t tmi_out_to_mac; 1850*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of packets forwarded to the Rx data path */ 1851*49b49cdaSZbigniew Bodek uint32_t tmi_out_to_rx; 1852*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted bytes */ 1853*49b49cdaSZbigniew Bodek uint32_t tx_q0_bytes; 1854*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted bytes */ 1855*49b49cdaSZbigniew Bodek uint32_t tx_q1_bytes; 1856*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted bytes */ 1857*49b49cdaSZbigniew Bodek uint32_t tx_q2_bytes; 1858*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted bytes */ 1859*49b49cdaSZbigniew Bodek uint32_t tx_q3_bytes; 1860*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted packets */ 1861*49b49cdaSZbigniew Bodek uint32_t tx_q0_pkts; 1862*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted packets */ 1863*49b49cdaSZbigniew Bodek uint32_t tx_q1_pkts; 1864*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted packets */ 1865*49b49cdaSZbigniew Bodek uint32_t tx_q2_pkts; 1866*49b49cdaSZbigniew Bodek /* Tx MAC interface, number of transmitted packets */ 1867*49b49cdaSZbigniew Bodek uint32_t tx_q3_pkts; 1868*49b49cdaSZbigniew Bodek }; 1869*49b49cdaSZbigniew Bodek 1870*49b49cdaSZbigniew Bodek /** 1871*49b49cdaSZbigniew Bodek * get per_udma statistics 1872*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure. 1873*49b49cdaSZbigniew Bodek * @param idx udma_id value 1874*49b49cdaSZbigniew Bodek * @param stats pointer to structure that will be filled with statistics. 1875*49b49cdaSZbigniew Bodek * 1876*49b49cdaSZbigniew Bodek * @return return 0 on success. otherwise on failure. 1877*49b49cdaSZbigniew Bodek */ 1878*49b49cdaSZbigniew Bodek int al_eth_ec_stat_udma_get(struct al_hal_eth_adapter *adapter, uint8_t idx, struct al_eth_ec_stat_udma *stats); 1879*49b49cdaSZbigniew Bodek 1880*49b49cdaSZbigniew Bodek /* trafic control */ 1881*49b49cdaSZbigniew Bodek 1882*49b49cdaSZbigniew Bodek /** 1883*49b49cdaSZbigniew Bodek * perform Function Level Reset RMN 1884*49b49cdaSZbigniew Bodek * 1885*49b49cdaSZbigniew Bodek * Addressing RMN: 714 1886*49b49cdaSZbigniew Bodek * 1887*49b49cdaSZbigniew Bodek * @param pci_read_config_u32 pointer to function that reads register from pci header 1888*49b49cdaSZbigniew Bodek * @param pci_write_config_u32 pointer to function that writes register from pci header 1889*49b49cdaSZbigniew Bodek * @param handle pointer passes to the above functions as first parameter 1890*49b49cdaSZbigniew Bodek * @param mac_base base address of the MAC registers 1891*49b49cdaSZbigniew Bodek * 1892*49b49cdaSZbigniew Bodek * @return 0. 1893*49b49cdaSZbigniew Bodek */ 1894*49b49cdaSZbigniew Bodek int al_eth_flr_rmn(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val), 1895*49b49cdaSZbigniew Bodek int (* pci_write_config_u32)(void *handle, int where, uint32_t val), 1896*49b49cdaSZbigniew Bodek void *handle, 1897*49b49cdaSZbigniew Bodek void __iomem *mac_base); 1898*49b49cdaSZbigniew Bodek 1899*49b49cdaSZbigniew Bodek /** 1900*49b49cdaSZbigniew Bodek * perform Function Level Reset RMN but restore registers that contain board specific data 1901*49b49cdaSZbigniew Bodek * 1902*49b49cdaSZbigniew Bodek * the data that save and restored is the board params and mac addresses 1903*49b49cdaSZbigniew Bodek * 1904*49b49cdaSZbigniew Bodek * @param pci_read_config_u32 pointer to function that reads register from pci header 1905*49b49cdaSZbigniew Bodek * @param pci_write_config_u32 pointer to function that writes register from pci header 1906*49b49cdaSZbigniew Bodek * @param handle pointer passes to the above functions as first parameter 1907*49b49cdaSZbigniew Bodek * @param mac_base base address of the MAC registers 1908*49b49cdaSZbigniew Bodek * @param ec_base base address of the Ethernet Controller registers 1909*49b49cdaSZbigniew Bodek * @param mac_addresses_num number of mac addresses to restore 1910*49b49cdaSZbigniew Bodek * 1911*49b49cdaSZbigniew Bodek * @return 0. 1912*49b49cdaSZbigniew Bodek */ 1913*49b49cdaSZbigniew Bodek int al_eth_flr_rmn_restore_params(int (* pci_read_config_u32)(void *handle, int where, uint32_t *val), 1914*49b49cdaSZbigniew Bodek int (* pci_write_config_u32)(void *handle, int where, uint32_t val), 1915*49b49cdaSZbigniew Bodek void *handle, 1916*49b49cdaSZbigniew Bodek void __iomem *mac_base, 1917*49b49cdaSZbigniew Bodek void __iomem *ec_base, 1918*49b49cdaSZbigniew Bodek int mac_addresses_num); 1919*49b49cdaSZbigniew Bodek 1920*49b49cdaSZbigniew Bodek /* board specific information (media type, phy address, etc.. */ 1921*49b49cdaSZbigniew Bodek 1922*49b49cdaSZbigniew Bodek 1923*49b49cdaSZbigniew Bodek enum al_eth_board_media_type { 1924*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT = 0, 1925*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_RGMII = 1, 1926*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_10GBASE_SR = 2, 1927*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_SGMII = 3, 1928*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_1000BASE_X = 4, 1929*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT_AUTO_SPEED = 5, 1930*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_SGMII_2_5G = 6, 1931*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MEDIA_TYPE_NBASE_T = 7, 1932*49b49cdaSZbigniew Bodek }; 1933*49b49cdaSZbigniew Bodek 1934*49b49cdaSZbigniew Bodek enum al_eth_board_mdio_freq { 1935*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MDIO_FREQ_2_5_MHZ = 0, 1936*49b49cdaSZbigniew Bodek AL_ETH_BOARD_MDIO_FREQ_1_MHZ = 1, 1937*49b49cdaSZbigniew Bodek }; 1938*49b49cdaSZbigniew Bodek 1939*49b49cdaSZbigniew Bodek enum al_eth_board_ext_phy_if { 1940*49b49cdaSZbigniew Bodek AL_ETH_BOARD_PHY_IF_MDIO = 0, 1941*49b49cdaSZbigniew Bodek AL_ETH_BOARD_PHY_IF_XMDIO = 1, 1942*49b49cdaSZbigniew Bodek AL_ETH_BOARD_PHY_IF_I2C = 2, 1943*49b49cdaSZbigniew Bodek 1944*49b49cdaSZbigniew Bodek }; 1945*49b49cdaSZbigniew Bodek 1946*49b49cdaSZbigniew Bodek enum al_eth_board_auto_neg_mode { 1947*49b49cdaSZbigniew Bodek AL_ETH_BOARD_AUTONEG_OUT_OF_BAND = 0, 1948*49b49cdaSZbigniew Bodek AL_ETH_BOARD_AUTONEG_IN_BAND = 1, 1949*49b49cdaSZbigniew Bodek 1950*49b49cdaSZbigniew Bodek }; 1951*49b49cdaSZbigniew Bodek 1952*49b49cdaSZbigniew Bodek /* declare the 1G mac active speed when auto negotiation disabled */ 1953*49b49cdaSZbigniew Bodek enum al_eth_board_1g_speed { 1954*49b49cdaSZbigniew Bodek AL_ETH_BOARD_1G_SPEED_1000M = 0, 1955*49b49cdaSZbigniew Bodek AL_ETH_BOARD_1G_SPEED_100M = 1, 1956*49b49cdaSZbigniew Bodek AL_ETH_BOARD_1G_SPEED_10M = 2, 1957*49b49cdaSZbigniew Bodek }; 1958*49b49cdaSZbigniew Bodek 1959*49b49cdaSZbigniew Bodek enum al_eth_retimer_channel { 1960*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_CHANNEL_A = 0, 1961*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_CHANNEL_B = 1, 1962*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_CHANNEL_C = 2, 1963*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_CHANNEL_D = 3, 1964*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_CHANNEL_MAX = 4 1965*49b49cdaSZbigniew Bodek }; 1966*49b49cdaSZbigniew Bodek 1967*49b49cdaSZbigniew Bodek /* list of supported retimers */ 1968*49b49cdaSZbigniew Bodek enum al_eth_retimer_type { 1969*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_BR_210 = 0, 1970*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_BR_410 = 1, 1971*49b49cdaSZbigniew Bodek 1972*49b49cdaSZbigniew Bodek AL_ETH_RETIMER_TYPE_MAX = 4, 1973*49b49cdaSZbigniew Bodek }; 1974*49b49cdaSZbigniew Bodek 1975*49b49cdaSZbigniew Bodek /** structure represents the board information. this info set by boot loader 1976*49b49cdaSZbigniew Bodek * and read by OS driver. 1977*49b49cdaSZbigniew Bodek */ 1978*49b49cdaSZbigniew Bodek struct al_eth_board_params { 1979*49b49cdaSZbigniew Bodek enum al_eth_board_media_type media_type; 1980*49b49cdaSZbigniew Bodek al_bool phy_exist; /**< external phy exist */ 1981*49b49cdaSZbigniew Bodek uint8_t phy_mdio_addr; /**< mdio address of external phy */ 1982*49b49cdaSZbigniew Bodek al_bool sfp_plus_module_exist; /**< SFP+ module connected */ 1983*49b49cdaSZbigniew Bodek al_bool autoneg_enable; /**< enable Auto-Negotiation */ 1984*49b49cdaSZbigniew Bodek al_bool kr_lt_enable; /**< enable KR Link-Training */ 1985*49b49cdaSZbigniew Bodek al_bool kr_fec_enable; /**< enable KR FEC */ 1986*49b49cdaSZbigniew Bodek enum al_eth_board_mdio_freq mdio_freq; /**< MDIO frequency */ 1987*49b49cdaSZbigniew Bodek uint8_t i2c_adapter_id; /**< identifier for the i2c adapter to use to access SFP+ module */ 1988*49b49cdaSZbigniew Bodek enum al_eth_board_ext_phy_if phy_if; /**< phy interface */ 1989*49b49cdaSZbigniew Bodek enum al_eth_board_auto_neg_mode an_mode; /**< auto-negotiation mode (in-band / out-of-band) */ 1990*49b49cdaSZbigniew Bodek uint8_t serdes_grp; /**< serdes's group id */ 1991*49b49cdaSZbigniew Bodek uint8_t serdes_lane; /**< serdes's lane id */ 1992*49b49cdaSZbigniew Bodek enum al_eth_ref_clk_freq ref_clk_freq; /**< reference clock frequency */ 1993*49b49cdaSZbigniew Bodek al_bool dont_override_serdes; /**< prevent override serdes parameters */ 1994*49b49cdaSZbigniew Bodek al_bool force_1000_base_x; /**< set mac to 1000 base-x mode (instead sgmii) */ 1995*49b49cdaSZbigniew Bodek al_bool an_disable; /**< disable auto negotiation */ 1996*49b49cdaSZbigniew Bodek enum al_eth_board_1g_speed speed; /**< port speed if AN disabled */ 1997*49b49cdaSZbigniew Bodek al_bool half_duplex; /**< force half duplex if AN disabled */ 1998*49b49cdaSZbigniew Bodek al_bool fc_disable; /**< disable flow control */ 1999*49b49cdaSZbigniew Bodek al_bool retimer_exist; /**< retimer is exist on the board */ 2000*49b49cdaSZbigniew Bodek uint8_t retimer_bus_id; /**< in what i2c bus the retimer is on */ 2001*49b49cdaSZbigniew Bodek uint8_t retimer_i2c_addr; /**< i2c address of the retimer */ 2002*49b49cdaSZbigniew Bodek enum al_eth_retimer_channel retimer_channel; /**< what channel connected to this port */ 2003*49b49cdaSZbigniew Bodek al_bool dac; /**< assume direct attached cable is connected if auto detect is off or failed */ 2004*49b49cdaSZbigniew Bodek uint8_t dac_len; /**< assume this cable length if auto detect is off or failed */ 2005*49b49cdaSZbigniew Bodek enum al_eth_retimer_type retimer_type; /**< the type of the specific retimer */ 2006*49b49cdaSZbigniew Bodek }; 2007*49b49cdaSZbigniew Bodek 2008*49b49cdaSZbigniew Bodek /** 2009*49b49cdaSZbigniew Bodek * set board parameter of the eth port 2010*49b49cdaSZbigniew Bodek * this function used to set the board parameters into scratchpad 2011*49b49cdaSZbigniew Bodek * registers. those paramters can be read later by OS driver. 2012*49b49cdaSZbigniew Bodek * 2013*49b49cdaSZbigniew Bodek * @param mac_base the virtual address of the mac registers (PCI BAR 2) 2014*49b49cdaSZbigniew Bodek * @param params pointer to structure the includes the paramters 2015*49b49cdaSZbigniew Bodek * 2016*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2017*49b49cdaSZbigniew Bodek */ 2018*49b49cdaSZbigniew Bodek int al_eth_board_params_set(void * __iomem mac_base, struct al_eth_board_params *params); 2019*49b49cdaSZbigniew Bodek 2020*49b49cdaSZbigniew Bodek /** 2021*49b49cdaSZbigniew Bodek * get board parameter of the eth port 2022*49b49cdaSZbigniew Bodek * this function used to get the board parameters from scratchpad 2023*49b49cdaSZbigniew Bodek * registers. 2024*49b49cdaSZbigniew Bodek * 2025*49b49cdaSZbigniew Bodek * @param mac_base the virtual address of the mac registers (PCI BAR 2) 2026*49b49cdaSZbigniew Bodek * @param params pointer to structure where the parameters will be stored. 2027*49b49cdaSZbigniew Bodek * 2028*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2029*49b49cdaSZbigniew Bodek */ 2030*49b49cdaSZbigniew Bodek int al_eth_board_params_get(void * __iomem mac_base, struct al_eth_board_params *params); 2031*49b49cdaSZbigniew Bodek 2032*49b49cdaSZbigniew Bodek /* 2033*49b49cdaSZbigniew Bodek * Wake-On-Lan (WoL) 2034*49b49cdaSZbigniew Bodek * 2035*49b49cdaSZbigniew Bodek * The following few functions configure the Wake-On-Lan packet detection 2036*49b49cdaSZbigniew Bodek * inside the Integrated Ethernet MAC. 2037*49b49cdaSZbigniew Bodek * 2038*49b49cdaSZbigniew Bodek * There are other alternative ways to set WoL, such using the 2039*49b49cdaSZbigniew Bodek * external 1000Base-T transceiver to set WoL mode. 2040*49b49cdaSZbigniew Bodek * 2041*49b49cdaSZbigniew Bodek * These APIs do not set the system-wide power-state, nor responsible on the 2042*49b49cdaSZbigniew Bodek * transition from Sleep to Normal power state. 2043*49b49cdaSZbigniew Bodek * 2044*49b49cdaSZbigniew Bodek * For system level considerations, please refer to Annapurna Labs Alpine Wiki. 2045*49b49cdaSZbigniew Bodek */ 2046*49b49cdaSZbigniew Bodek /* Interrupt enable WoL MAC DA Unicast detected packet */ 2047*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_UNICAST AL_BIT(0) 2048*49b49cdaSZbigniew Bodek /* Interrupt enable WoL L2 Multicast detected packet */ 2049*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MULTICAST AL_BIT(1) 2050*49b49cdaSZbigniew Bodek /* Interrupt enable WoL L2 Broadcast detected packet */ 2051*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_BROADCAST AL_BIT(2) 2052*49b49cdaSZbigniew Bodek /* Interrupt enable WoL IPv4 detected packet */ 2053*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_IPV4 AL_BIT(3) 2054*49b49cdaSZbigniew Bodek /* Interrupt enable WoL IPv6 detected packet */ 2055*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_IPV6 AL_BIT(4) 2056*49b49cdaSZbigniew Bodek /* Interrupt enable WoL EtherType+MAC DA detected packet */ 2057*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_ETHERTYPE_DA AL_BIT(5) 2058*49b49cdaSZbigniew Bodek /* Interrupt enable WoL EtherType+L2 Broadcast detected packet */ 2059*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_ETHERTYPE_BC AL_BIT(6) 2060*49b49cdaSZbigniew Bodek /* Interrupt enable WoL parser detected packet */ 2061*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_PARSER AL_BIT(7) 2062*49b49cdaSZbigniew Bodek /* Interrupt enable WoL magic detected packet */ 2063*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MAGIC AL_BIT(8) 2064*49b49cdaSZbigniew Bodek /* Interrupt enable WoL magic+password detected packet */ 2065*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_INT_MAGIC_PSWD AL_BIT(9) 2066*49b49cdaSZbigniew Bodek 2067*49b49cdaSZbigniew Bodek /* Forward enable WoL MAC DA Unicast detected packet */ 2068*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_UNICAST AL_BIT(0) 2069*49b49cdaSZbigniew Bodek /* Forward enable WoL L2 Multicast detected packet */ 2070*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_MULTICAST AL_BIT(1) 2071*49b49cdaSZbigniew Bodek /* Forward enable WoL L2 Broadcast detected packet */ 2072*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_BROADCAST AL_BIT(2) 2073*49b49cdaSZbigniew Bodek /* Forward enable WoL IPv4 detected packet */ 2074*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_IPV4 AL_BIT(3) 2075*49b49cdaSZbigniew Bodek /* Forward enable WoL IPv6 detected packet */ 2076*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_IPV6 AL_BIT(4) 2077*49b49cdaSZbigniew Bodek /* Forward enable WoL EtherType+MAC DA detected packet */ 2078*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_ETHERTYPE_DA AL_BIT(5) 2079*49b49cdaSZbigniew Bodek /* Forward enable WoL EtherType+L2 Broadcast detected packet */ 2080*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_ETHERTYPE_BC AL_BIT(6) 2081*49b49cdaSZbigniew Bodek /* Forward enable WoL parser detected packet */ 2082*49b49cdaSZbigniew Bodek #define AL_ETH_WOL_FWRD_PARSER AL_BIT(7) 2083*49b49cdaSZbigniew Bodek 2084*49b49cdaSZbigniew Bodek struct al_eth_wol_params { 2085*49b49cdaSZbigniew Bodek uint8_t *dest_addr; /**< 6 bytes array of destanation address for 2086*49b49cdaSZbigniew Bodek magic packet detection */ 2087*49b49cdaSZbigniew Bodek uint8_t *pswd; /**< 6 bytes array of the password to use */ 2088*49b49cdaSZbigniew Bodek uint8_t *ipv4; /**< 4 bytes array of the ipv4 to use. 2089*49b49cdaSZbigniew Bodek example: for ip = 192.168.1.2 2090*49b49cdaSZbigniew Bodek ipv4[0]=2, ipv4[1]=1, ipv4[2]=168, ipv4[3]=192 */ 2091*49b49cdaSZbigniew Bodek uint8_t *ipv6; /** 16 bytes array of the ipv6 to use. 2092*49b49cdaSZbigniew Bodek example: ip = 2607:f0d0:1002:0051:0000:0000:5231:1234 2093*49b49cdaSZbigniew Bodek ipv6[0]=34, ipv6[1]=12, ipv6[2]=31 .. */ 2094*49b49cdaSZbigniew Bodek uint16_t ethr_type1; /**< first ethertype to use */ 2095*49b49cdaSZbigniew Bodek uint16_t ethr_type2; /**< secound ethertype to use */ 2096*49b49cdaSZbigniew Bodek uint16_t forward_mask; /**< bitmask of AL_ETH_WOL_FWRD_* of the packet 2097*49b49cdaSZbigniew Bodek types needed to be forward. */ 2098*49b49cdaSZbigniew Bodek uint16_t int_mask; /**< bitmask of AL_ETH_WOL_INT_* of the packet types 2099*49b49cdaSZbigniew Bodek that will send interrupt to wake the system. */ 2100*49b49cdaSZbigniew Bodek }; 2101*49b49cdaSZbigniew Bodek 2102*49b49cdaSZbigniew Bodek /** 2103*49b49cdaSZbigniew Bodek * enable the wol mechanism 2104*49b49cdaSZbigniew Bodek * set what type of packets will wake up the system and what type of packets 2105*49b49cdaSZbigniew Bodek * neet to forward after the system is up 2106*49b49cdaSZbigniew Bodek * 2107*49b49cdaSZbigniew Bodek * beside this function wol filter also need to be set by 2108*49b49cdaSZbigniew Bodek * calling al_eth_filter_config with AL_ETH_RFW_FILTER_WOL 2109*49b49cdaSZbigniew Bodek * 2110*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2111*49b49cdaSZbigniew Bodek * @param wol the parameters needed to configure the wol 2112*49b49cdaSZbigniew Bodek * 2113*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2114*49b49cdaSZbigniew Bodek */ 2115*49b49cdaSZbigniew Bodek int al_eth_wol_enable( 2116*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter, 2117*49b49cdaSZbigniew Bodek struct al_eth_wol_params *wol); 2118*49b49cdaSZbigniew Bodek 2119*49b49cdaSZbigniew Bodek /** 2120*49b49cdaSZbigniew Bodek * Disable the WoL mechnism. 2121*49b49cdaSZbigniew Bodek * 2122*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2123*49b49cdaSZbigniew Bodek * 2124*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2125*49b49cdaSZbigniew Bodek */ 2126*49b49cdaSZbigniew Bodek int al_eth_wol_disable( 2127*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter); 2128*49b49cdaSZbigniew Bodek 2129*49b49cdaSZbigniew Bodek /** 2130*49b49cdaSZbigniew Bodek * Configure tx fwd vlan table entry 2131*49b49cdaSZbigniew Bodek * 2132*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2133*49b49cdaSZbigniew Bodek * @param idx the entry index within the vlan table. The HW uses the vlan id 2134*49b49cdaSZbigniew Bodek * field of the packet when accessing this table. 2135*49b49cdaSZbigniew Bodek * @param udma_mask vlan table value that indicates that the packet should be forward back to 2136*49b49cdaSZbigniew Bodek * the udmas, through the Rx path (udma_mask is one-hot representation) 2137*49b49cdaSZbigniew Bodek * @param fwd_to_mac vlan table value that indicates that the packet should be forward to mac 2138*49b49cdaSZbigniew Bodek * 2139*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2140*49b49cdaSZbigniew Bodek */ 2141*49b49cdaSZbigniew Bodek int al_eth_tx_fwd_vid_table_set(struct al_hal_eth_adapter *adapter, uint32_t idx, uint8_t udma_mask, al_bool fwd_to_mac); 2142*49b49cdaSZbigniew Bodek 2143*49b49cdaSZbigniew Bodek /** Tx Generic protocol detect Cam compare table entry */ 2144*49b49cdaSZbigniew Bodek struct al_eth_tx_gpd_cam_entry { 2145*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID l3_proto_idx; 2146*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID l4_proto_idx; 2147*49b49cdaSZbigniew Bodek enum AL_ETH_TX_TUNNEL_MODE tunnel_control; 2148*49b49cdaSZbigniew Bodek uint8_t source_vlan_count:2; 2149*49b49cdaSZbigniew Bodek uint8_t tx_gpd_cam_ctrl:1; 2150*49b49cdaSZbigniew Bodek uint8_t l3_proto_idx_mask:5; 2151*49b49cdaSZbigniew Bodek uint8_t l4_proto_idx_mask:5; 2152*49b49cdaSZbigniew Bodek uint8_t tunnel_control_mask:3; 2153*49b49cdaSZbigniew Bodek uint8_t source_vlan_count_mask:2; 2154*49b49cdaSZbigniew Bodek }; 2155*49b49cdaSZbigniew Bodek 2156*49b49cdaSZbigniew Bodek /** Rx Generic protocol detect Cam compare table entry */ 2157*49b49cdaSZbigniew Bodek struct al_eth_rx_gpd_cam_entry { 2158*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID outer_l3_proto_idx; 2159*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID outer_l4_proto_idx; 2160*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID inner_l3_proto_idx; 2161*49b49cdaSZbigniew Bodek enum AL_ETH_PROTO_ID inner_l4_proto_idx; 2162*49b49cdaSZbigniew Bodek uint8_t parse_ctrl; 2163*49b49cdaSZbigniew Bodek uint8_t outer_l3_len; 2164*49b49cdaSZbigniew Bodek uint8_t l3_priority; 2165*49b49cdaSZbigniew Bodek uint8_t l4_dst_port_lsb; 2166*49b49cdaSZbigniew Bodek uint8_t rx_gpd_cam_ctrl:1; 2167*49b49cdaSZbigniew Bodek uint8_t outer_l3_proto_idx_mask:5; 2168*49b49cdaSZbigniew Bodek uint8_t outer_l4_proto_idx_mask:5; 2169*49b49cdaSZbigniew Bodek uint8_t inner_l3_proto_idx_mask:5; 2170*49b49cdaSZbigniew Bodek uint8_t inner_l4_proto_idx_mask:5; 2171*49b49cdaSZbigniew Bodek uint8_t parse_ctrl_mask; 2172*49b49cdaSZbigniew Bodek uint8_t outer_l3_len_mask; 2173*49b49cdaSZbigniew Bodek uint8_t l3_priority_mask; 2174*49b49cdaSZbigniew Bodek uint8_t l4_dst_port_lsb_mask; 2175*49b49cdaSZbigniew Bodek }; 2176*49b49cdaSZbigniew Bodek 2177*49b49cdaSZbigniew Bodek enum AL_ETH_TX_GCP_ALU_OPSEL { 2178*49b49cdaSZbigniew Bodek AL_ETH_TX_GCP_ALU_L3_OFFSET = 0, 2179*49b49cdaSZbigniew Bodek AL_ETH_TX_GCP_ALU_OUTER_L3_OFFSET = 1, 2180*49b49cdaSZbigniew Bodek AL_ETH_TX_GCP_ALU_L3_LEN = 2, 2181*49b49cdaSZbigniew Bodek AL_ETH_TX_GCP_ALU_OUTER_L3_LEN = 3, 2182*49b49cdaSZbigniew Bodek AL_ETH_TX_GCP_ALU_L4_OFFSET = 4, 2183*49b49cdaSZbigniew Bodek AL_ETH_TX_GCP_ALU_L4_LEN = 5, 2184*49b49cdaSZbigniew Bodek AL_ETH_TX_GCP_ALU_TABLE_VAL = 10 2185*49b49cdaSZbigniew Bodek }; 2186*49b49cdaSZbigniew Bodek 2187*49b49cdaSZbigniew Bodek enum AL_ETH_RX_GCP_ALU_OPSEL { 2188*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_OUTER_L3_OFFSET = 0, 2189*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_INNER_L3_OFFSET = 1, 2190*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_OUTER_L4_OFFSET = 2, 2191*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_INNER_L4_OFFSET = 3, 2192*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_LAT = 4, 2193*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_LAT = 5, 2194*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_OUTER_L3_HDR_LEN_SEL = 6, 2195*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_INNER_L3_HDR_LEN_SEL = 7, 2196*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_1 = 8, 2197*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_PARSE_RESULT_VECTOR_OFFSET_2 = 9, 2198*49b49cdaSZbigniew Bodek AL_ETH_RX_GCP_ALU_TABLE_VAL = 10 2199*49b49cdaSZbigniew Bodek }; 2200*49b49cdaSZbigniew Bodek 2201*49b49cdaSZbigniew Bodek /** Tx Generic crc prameters table entry */ 2202*49b49cdaSZbigniew Bodek 2203*49b49cdaSZbigniew Bodek struct al_eth_tx_gcp_table_entry { 2204*49b49cdaSZbigniew Bodek uint8_t poly_sel:1; 2205*49b49cdaSZbigniew Bodek uint8_t crc32_bit_comp:1; 2206*49b49cdaSZbigniew Bodek uint8_t crc32_bit_swap:1; 2207*49b49cdaSZbigniew Bodek uint8_t crc32_byte_swap:1; 2208*49b49cdaSZbigniew Bodek uint8_t data_bit_swap:1; 2209*49b49cdaSZbigniew Bodek uint8_t data_byte_swap:1; 2210*49b49cdaSZbigniew Bodek uint8_t trail_size:4; 2211*49b49cdaSZbigniew Bodek uint8_t head_size:8; 2212*49b49cdaSZbigniew Bodek uint8_t head_calc:1; 2213*49b49cdaSZbigniew Bodek uint8_t mask_polarity:1; 2214*49b49cdaSZbigniew Bodek enum AL_ETH_ALU_OPCODE tx_alu_opcode_1; 2215*49b49cdaSZbigniew Bodek enum AL_ETH_ALU_OPCODE tx_alu_opcode_2; 2216*49b49cdaSZbigniew Bodek enum AL_ETH_ALU_OPCODE tx_alu_opcode_3; 2217*49b49cdaSZbigniew Bodek enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_1; 2218*49b49cdaSZbigniew Bodek enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_2; 2219*49b49cdaSZbigniew Bodek enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_3; 2220*49b49cdaSZbigniew Bodek enum AL_ETH_TX_GCP_ALU_OPSEL tx_alu_opsel_4; 2221*49b49cdaSZbigniew Bodek uint32_t gcp_mask[6]; 2222*49b49cdaSZbigniew Bodek uint32_t crc_init; 2223*49b49cdaSZbigniew Bodek uint8_t gcp_table_res:7; 2224*49b49cdaSZbigniew Bodek uint16_t alu_val:9; 2225*49b49cdaSZbigniew Bodek }; 2226*49b49cdaSZbigniew Bodek 2227*49b49cdaSZbigniew Bodek /** Rx Generic crc prameters table entry */ 2228*49b49cdaSZbigniew Bodek 2229*49b49cdaSZbigniew Bodek struct al_eth_rx_gcp_table_entry { 2230*49b49cdaSZbigniew Bodek uint8_t poly_sel:1; 2231*49b49cdaSZbigniew Bodek uint8_t crc32_bit_comp:1; 2232*49b49cdaSZbigniew Bodek uint8_t crc32_bit_swap:1; 2233*49b49cdaSZbigniew Bodek uint8_t crc32_byte_swap:1; 2234*49b49cdaSZbigniew Bodek uint8_t data_bit_swap:1; 2235*49b49cdaSZbigniew Bodek uint8_t data_byte_swap:1; 2236*49b49cdaSZbigniew Bodek uint8_t trail_size:4; 2237*49b49cdaSZbigniew Bodek uint8_t head_size:8; 2238*49b49cdaSZbigniew Bodek uint8_t head_calc:1; 2239*49b49cdaSZbigniew Bodek uint8_t mask_polarity:1; 2240*49b49cdaSZbigniew Bodek enum AL_ETH_ALU_OPCODE rx_alu_opcode_1; 2241*49b49cdaSZbigniew Bodek enum AL_ETH_ALU_OPCODE rx_alu_opcode_2; 2242*49b49cdaSZbigniew Bodek enum AL_ETH_ALU_OPCODE rx_alu_opcode_3; 2243*49b49cdaSZbigniew Bodek enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_1; 2244*49b49cdaSZbigniew Bodek enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_2; 2245*49b49cdaSZbigniew Bodek enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_3; 2246*49b49cdaSZbigniew Bodek enum AL_ETH_RX_GCP_ALU_OPSEL rx_alu_opsel_4; 2247*49b49cdaSZbigniew Bodek uint32_t gcp_mask[6]; 2248*49b49cdaSZbigniew Bodek uint32_t crc_init; 2249*49b49cdaSZbigniew Bodek uint32_t gcp_table_res:27; 2250*49b49cdaSZbigniew Bodek uint16_t alu_val:9; 2251*49b49cdaSZbigniew Bodek }; 2252*49b49cdaSZbigniew Bodek 2253*49b49cdaSZbigniew Bodek /** Tx per_protocol_number crc & l3_checksum & l4_checksum command table entry */ 2254*49b49cdaSZbigniew Bodek 2255*49b49cdaSZbigniew Bodek struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry { 2256*49b49cdaSZbigniew Bodek al_bool crc_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */ 2257*49b49cdaSZbigniew Bodek al_bool crc_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */ 2258*49b49cdaSZbigniew Bodek al_bool crc_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */ 2259*49b49cdaSZbigniew Bodek al_bool crc_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */ 2260*49b49cdaSZbigniew Bodek al_bool l4_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */ 2261*49b49cdaSZbigniew Bodek al_bool l4_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */ 2262*49b49cdaSZbigniew Bodek al_bool l4_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */ 2263*49b49cdaSZbigniew Bodek al_bool l4_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */ 2264*49b49cdaSZbigniew Bodek al_bool l3_csum_en_00; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 0 */ 2265*49b49cdaSZbigniew Bodek al_bool l3_csum_en_01; /*from Tx_buffer_descriptor: enable_l4_checksum is 0 ,enable_l3_checksum is 1 */ 2266*49b49cdaSZbigniew Bodek al_bool l3_csum_en_10; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 0 */ 2267*49b49cdaSZbigniew Bodek al_bool l3_csum_en_11; /*from Tx_buffer_descriptor: enable_l4_checksum is 1 ,enable_l3_checksum is 1 */ 2268*49b49cdaSZbigniew Bodek }; 2269*49b49cdaSZbigniew Bodek 2270*49b49cdaSZbigniew Bodek /** 2271*49b49cdaSZbigniew Bodek * Configure tx_gpd_entry 2272*49b49cdaSZbigniew Bodek * 2273*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2274*49b49cdaSZbigniew Bodek * @param idx the entry index 2275*49b49cdaSZbigniew Bodek * @param tx_gpd_entry entry data for the Tx protocol detect Cam compare table 2276*49b49cdaSZbigniew Bodek * 2277*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2278*49b49cdaSZbigniew Bodek * 2279*49b49cdaSZbigniew Bodek */ 2280*49b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 2281*49b49cdaSZbigniew Bodek struct al_eth_tx_gpd_cam_entry *tx_gpd_entry); 2282*49b49cdaSZbigniew Bodek 2283*49b49cdaSZbigniew Bodek /** 2284*49b49cdaSZbigniew Bodek * Configure tx_gcp_entry 2285*49b49cdaSZbigniew Bodek * 2286*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2287*49b49cdaSZbigniew Bodek * @param idx the entry index 2288*49b49cdaSZbigniew Bodek * @param tx_gcp_entry entry data for the Tx Generic crc prameters table 2289*49b49cdaSZbigniew Bodek * 2290*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2291*49b49cdaSZbigniew Bodek * 2292*49b49cdaSZbigniew Bodek */ 2293*49b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 2294*49b49cdaSZbigniew Bodek struct al_eth_tx_gcp_table_entry *tx_gcp_entry); 2295*49b49cdaSZbigniew Bodek 2296*49b49cdaSZbigniew Bodek /** 2297*49b49cdaSZbigniew Bodek * Configure tx_crc_chksum_replace_cmd_entry 2298*49b49cdaSZbigniew Bodek * 2299*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2300*49b49cdaSZbigniew Bodek * @param idx the entry index 2301*49b49cdaSZbigniew Bodek * @param tx_replace_entry entry data for the Tx crc_&_l3_checksum_&_l4_checksum replace command table 2302*49b49cdaSZbigniew Bodek * 2303*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2304*49b49cdaSZbigniew Bodek * 2305*49b49cdaSZbigniew Bodek */ 2306*49b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 2307*49b49cdaSZbigniew Bodek struct al_eth_tx_crc_chksum_replace_cmd_for_protocol_num_entry *tx_replace_entry); 2308*49b49cdaSZbigniew Bodek 2309*49b49cdaSZbigniew Bodek /** 2310*49b49cdaSZbigniew Bodek * Configure rx_gpd_entry 2311*49b49cdaSZbigniew Bodek * 2312*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2313*49b49cdaSZbigniew Bodek * @param idx the entry index 2314*49b49cdaSZbigniew Bodek * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table 2315*49b49cdaSZbigniew Bodek * 2316*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2317*49b49cdaSZbigniew Bodek * 2318*49b49cdaSZbigniew Bodek */ 2319*49b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 2320*49b49cdaSZbigniew Bodek struct al_eth_rx_gpd_cam_entry *rx_gpd_entry); 2321*49b49cdaSZbigniew Bodek 2322*49b49cdaSZbigniew Bodek /** 2323*49b49cdaSZbigniew Bodek * Configure rx_gcp_entry 2324*49b49cdaSZbigniew Bodek * 2325*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2326*49b49cdaSZbigniew Bodek * @param idx the entry index 2327*49b49cdaSZbigniew Bodek * @param rx_gpd_entry entry data for the Tx protocol detect Cam compare table 2328*49b49cdaSZbigniew Bodek * @param rx_gcp_entry entry data for the Tx Generic crc prameters table 2329*49b49cdaSZbigniew Bodek * 2330*49b49cdaSZbigniew Bodek * @return 0 on success. otherwise on failure. 2331*49b49cdaSZbigniew Bodek * 2332*49b49cdaSZbigniew Bodek */ 2333*49b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_entry_set(struct al_hal_eth_adapter *adapter, uint32_t idx, 2334*49b49cdaSZbigniew Bodek struct al_eth_rx_gcp_table_entry *rx_gcp_entry); 2335*49b49cdaSZbigniew Bodek 2336*49b49cdaSZbigniew Bodek /** 2337*49b49cdaSZbigniew Bodek * Configure tx_gpd_table and regs 2338*49b49cdaSZbigniew Bodek * 2339*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2340*49b49cdaSZbigniew Bodek * 2341*49b49cdaSZbigniew Bodek */ 2342*49b49cdaSZbigniew Bodek int al_eth_tx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter); 2343*49b49cdaSZbigniew Bodek 2344*49b49cdaSZbigniew Bodek /** 2345*49b49cdaSZbigniew Bodek * Configure crc_chksum_replace_cmd_table 2346*49b49cdaSZbigniew Bodek * 2347*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2348*49b49cdaSZbigniew Bodek * 2349*49b49cdaSZbigniew Bodek */ 2350*49b49cdaSZbigniew Bodek int al_eth_tx_crc_chksum_replace_cmd_init(struct al_hal_eth_adapter *adapter); 2351*49b49cdaSZbigniew Bodek 2352*49b49cdaSZbigniew Bodek /** 2353*49b49cdaSZbigniew Bodek * Configure tx_gcp_table and regs 2354*49b49cdaSZbigniew Bodek * 2355*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2356*49b49cdaSZbigniew Bodek * 2357*49b49cdaSZbigniew Bodek */ 2358*49b49cdaSZbigniew Bodek int al_eth_tx_generic_crc_table_init(struct al_hal_eth_adapter *adapter); 2359*49b49cdaSZbigniew Bodek 2360*49b49cdaSZbigniew Bodek /** 2361*49b49cdaSZbigniew Bodek * Configure rx_gpd_table and regs 2362*49b49cdaSZbigniew Bodek * 2363*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2364*49b49cdaSZbigniew Bodek * 2365*49b49cdaSZbigniew Bodek */ 2366*49b49cdaSZbigniew Bodek int al_eth_rx_protocol_detect_table_init(struct al_hal_eth_adapter *adapter); 2367*49b49cdaSZbigniew Bodek 2368*49b49cdaSZbigniew Bodek /** 2369*49b49cdaSZbigniew Bodek * Configure rx_gcp_table and regs 2370*49b49cdaSZbigniew Bodek * 2371*49b49cdaSZbigniew Bodek * @param adapter pointer to the private structure 2372*49b49cdaSZbigniew Bodek * 2373*49b49cdaSZbigniew Bodek */ 2374*49b49cdaSZbigniew Bodek int al_eth_rx_generic_crc_table_init(struct al_hal_eth_adapter *adapter); 2375*49b49cdaSZbigniew Bodek 2376*49b49cdaSZbigniew Bodek #ifdef __cplusplus 2377*49b49cdaSZbigniew Bodek } 2378*49b49cdaSZbigniew Bodek #endif 2379*49b49cdaSZbigniew Bodek /* *INDENT-ON* */ 2380*49b49cdaSZbigniew Bodek #endif /* __AL_HAL_ETH_H__ */ 2381*49b49cdaSZbigniew Bodek /** @} end of Ethernet group */ 2382