blob: 8c8a3328285dd7027cd8853cc36dfa16851fe580 [file] [log] [blame]
/*
* Copyright © 2018 Broadcom. All Rights Reserved.
* The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
* This program is free software; you can redistribute it and/or modify it under
* the terms of version 2 of the GNU General Public License as published by the
* Free Software Foundation.
* This program is distributed in the hope that it will be useful.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
* NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS
* ARE HELD TO BE LEGALLY INVALID. See the GNU General Public License for more
* details, a copy of which can be found in the file COPYING included with this
* package.
*/
#undef ERRFILE
#define ERRFILE ERRFILE_tg3
#define __le16 u16
#define __le32 u32
#define __le64 u64
#define __be16 u16
#define __be32 u32
#define __be64 u64
#define dma_addr_t unsigned long
union dma_addr64_t {
dma_addr_t addr;
u64 as_u64;
};
#include "bnxt_hsi.h"
#define DRV_MODULE_NAME "bnxt"
#define IPXE_VERSION_MAJOR 1
#define IPXE_VERSION_MINOR 0
#define IPXE_VERSION_UPDATE 0
/*
* Broadcom ethernet driver defines.
*/
#define FLAG_SET(f, b) ((f) |= (b))
#define FLAG_TEST(f, b) ((f) & (b))
#define FLAG_RESET(f, b) ((f) &= ~(b))
#define BNXT_FLAG_HWRM_SHORT_CMD_SUPP 0x0001
#define BNXT_FLAG_HWRM_SHORT_CMD_REQ 0x0002
#define BNXT_FLAG_RESOURCE_QCAPS_SUPPORT 0x0004
#define BNXT_FLAG_MULTI_HOST 0x0008
#define BNXT_FLAG_NPAR_MODE 0x0010
#define BNXT_FLAG_ATOMICS_ENABLE 0x0020
#define BNXT_FLAG_PCI_VF 0x0040
#define BNXT_FLAG_LINK_SPEEDS2 0x0080
#define BNXT_FLAG_IS_CHIP_P5 0x0100
#define BNXT_FLAG_IS_CHIP_P5_PLUS 0x0200
#define BNXT_FLAG_IS_CHIP_P7 0x0400
/*******************************************************************************
* Status codes.
******************************************************************************/
#define STATUS_SUCCESS 0
#define STATUS_FAILURE 1
#define STATUS_NO_RESOURCE 2
#define STATUS_INVALID_PARAMETER 3
#define STATUS_LINK_ACTIVE 4
#define STATUS_LINK_DOWN 5
#define STATUS_LINK_SETTING_MISMATCH 6
#define STATUS_TOO_MANY_FRAGMENTS 7
#define STATUS_TRANSMIT_ABORTED 8
#define STATUS_TRANSMIT_ERROR 9
#define STATUS_RECEIVE_ABORTED 10
#define STATUS_RECEIVE_ERROR 11
#define STATUS_INVALID_PACKET_SIZE 12
#define STATUS_NO_MAP_REGISTER 13
#define STATUS_UNKNOWN_ADAPTER 14
#define STATUS_NO_COALESCE_BUFFER 15
#define STATUS_UNKNOWN_PHY 16
#define STATUS_PENDING 17
#define STATUS_NO_TX_DESC 18
#define STATUS_NO_TX_BD 19
#define STATUS_UNKNOWN_MEDIUM 20
#define STATUS_RESOURCE 21
#define STATUS_ABORT_REASON_DISCONNECT 22
#define STATUS_ABORT_REASON_UPLOAD 23
#define STATUS_TIMEOUT 0xffff
/*******************************************************************************
* Receive filter masks.
******************************************************************************/
#define RX_MASK_ACCEPT_NONE 0x0000
#define RX_MASK_ACCEPT_UNICAST 0x0001
#define RX_MASK_ACCEPT_MULTICAST 0x0002
#define RX_MASK_ACCEPT_ALL_MULTICAST 0x0004
#define RX_MASK_ACCEPT_BROADCAST 0x0008
#define RX_MASK_ACCEPT_ERROR_PACKET 0x0010
#define RX_MASK_PROMISCUOUS_MODE 0x10000
/*******************************************************************************
* media speed.
******************************************************************************/
#define MEDIUM_SPEED_AUTONEG 0x0000L
#define MEDIUM_SPEED_UNKNOWN 0x0000L
#define MEDIUM_SPEED_10MBPS 0x0100L
#define MEDIUM_SPEED_100MBPS 0x0200L
#define MEDIUM_SPEED_1000MBPS 0x0300L
#define MEDIUM_SPEED_2500MBPS 0x0400L
#define MEDIUM_SPEED_10GBPS 0x0600L
#define MEDIUM_SPEED_20GBPS 0x0700L
#define MEDIUM_SPEED_25GBPS 0x0800L
#define MEDIUM_SPEED_40GBPS 0x0900L
#define MEDIUM_SPEED_50GBPS 0x0a00L
#define MEDIUM_SPEED_100GBPS 0x0b00L
#define MEDIUM_SPEED_200GBPS 0x0c00L
#define MEDIUM_SPEED_50PAM4GBPS 0x0d00L
#define MEDIUM_SPEED_100PAM4GBPS 0x0e00L
#define MEDIUM_SPEED_100PAM4_112GBPS 0x0f00L
#define MEDIUM_SPEED_200PAM4_112GBPS 0x1000L
#define MEDIUM_SPEED_400PAM4GBPS 0x2000L
#define MEDIUM_SPEED_400PAM4_112GBPS 0x3000L
#define MEDIUM_SPEED_AUTONEG_1G_FALLBACK 0x8000L /* Serdes */
#define MEDIUM_SPEED_AUTONEG_2_5G_FALLBACK 0x8100L /* Serdes */
#define MEDIUM_SPEED_HARDWARE_DEFAULT 0xff00L /* Serdes nvram def.*/
#define MEDIUM_SPEED_MASK 0xff00L
#define GET_MEDIUM_SPEED(m) ((m) & MEDIUM_SPEED_MASK)
#define SET_MEDIUM_SPEED(bp, s) ((bp->medium & ~MEDIUM_SPEED_MASK) | s)
#define MEDIUM_UNKNOWN_DUPLEX 0x00000L
#define MEDIUM_FULL_DUPLEX 0x00000L
#define MEDIUM_HALF_DUPLEX 0x10000L
#define GET_MEDIUM_DUPLEX(m) ((m) & MEDIUM_HALF_DUPLEX)
#define SET_MEDIUM_DUPLEX(bp, d) ((bp->medium & ~MEDIUM_HALF_DUPLEX) | d)
#define MEDIUM_SELECTIVE_AUTONEG 0x01000000L
#define GET_MEDIUM_AUTONEG_MODE(m) ((m) & 0xff000000L)
#define PCICFG_ME_REGISTER 0x98
#define GRC_COM_CHAN_BASE 0
#define GRC_COM_CHAN_TRIG 0x100
#define GRC_IND_BAR_0_ADDR 0x78
#define GRC_IND_BAR_1_ADDR 0x7C
#define GRC_IND_BAR_0_DATA 0x80
#define GRC_IND_BAR_1_DATA 0x84
#define GRC_BASE_WIN_0 0x400
#define GRC_DATA_WIN_0 0x1000
#define HWRM_CMD_DEFAULT_TIMEOUT 500 /* in Miliseconds */
#define HWRM_CMD_POLL_WAIT_TIME 100 /* In MicroeSconds */
#define HWRM_CMD_DEFAULT_MULTIPLAYER(a) ((a) * 10)
#define HWRM_CMD_FLASH_MULTIPLAYER(a) ((a) * 100)
#define HWRM_CMD_FLASH_ERASE_MULTIPLAYER(a) ((a) * 1000)
#define HWRM_CMD_WAIT(b) ((bp->hwrm_cmd_timeout) * (b))
#define MAX_ETHERNET_PACKET_BUFFER_SIZE 1536
#define DEFAULT_NUMBER_OF_CMPL_RINGS 0x01
#define DEFAULT_NUMBER_OF_TX_RINGS 0x01
#define DEFAULT_NUMBER_OF_RX_RINGS 0x01
#define DEFAULT_NUMBER_OF_RING_GRPS 0x01
#define DEFAULT_NUMBER_OF_STAT_CTXS 0x01
#define NUM_RX_BUFFERS 8
#define MAX_RX_DESC_CNT 16
#define MAX_TX_DESC_CNT 16
#define MAX_CQ_DESC_CNT 64
#define TX_RING_BUFFER_SIZE (MAX_TX_DESC_CNT * sizeof(struct tx_bd_short))
#define RX_RING_BUFFER_SIZE \
(MAX_RX_DESC_CNT * sizeof(struct rx_prod_pkt_bd))
#define CQ_RING_BUFFER_SIZE (MAX_CQ_DESC_CNT * sizeof(struct cmpl_base))
#define BNXT_DMA_ALIGNMENT 256 //64
#define DMA_ALIGN_4K 4096 //thor tx & rx
#define REQ_BUFFER_SIZE 1024
#define RESP_BUFFER_SIZE 1024
#define DMA_BUFFER_SIZE 1024
#define LM_PAGE_BITS(a) (a)
#define BNXT_RX_STD_DMA_SZ (1536 + 64 + 2)
#define NEXT_IDX(N, S) (((N) + 1) & ((S) - 1))
#define BD_NOW(bd, entry, len) (&((u8 *)(bd))[(entry) * (len)])
#define BNXT_CQ_INTR_MODE(vf) (\
((vf) ? RING_ALLOC_REQ_INT_MODE_MSIX : RING_ALLOC_REQ_INT_MODE_POLL))
/* Set default link timeout period to 1 second */
#define LINK_DEFAULT_TIMEOUT 1000
#define LINK_POLL_WAIT_TIME 100 /* In Miliseconds */
#define RX_MASK (\
RX_MASK_ACCEPT_BROADCAST | \
RX_MASK_ACCEPT_ALL_MULTICAST | \
RX_MASK_ACCEPT_MULTICAST)
#define MAX_NQ_DESC_CNT 64
#define NQ_RING_BUFFER_SIZE (MAX_NQ_DESC_CNT * sizeof(struct cmpl_base))
#define TX_RING_QID (FLAG_TEST(bp->flags, BNXT_FLAG_IS_CHIP_P5_PLUS) ? (u16)bp->queue_id : ((u16)bp->port_idx * 10))
#define RX_RING_QID (FLAG_TEST(bp->flags, BNXT_FLAG_IS_CHIP_P5_PLUS) ? bp->queue_id : 0)
#define STAT_CTX_ID ((bp->vf || FLAG_TEST(bp->flags, BNXT_FLAG_IS_CHIP_P5_PLUS)) ? bp->stat_ctx_id : 0)
#define TX_AVAIL(r) (r - 1)
#define TX_IN_USE(a, b, c) ((a - b) & (c - 1))
#define NO_MORE_NQ_BD_TO_SERVICE 1
#define SERVICE_NEXT_NQ_BD 0
#define NO_MORE_CQ_BD_TO_SERVICE 1
#define SERVICE_NEXT_CQ_BD 0
#define MAC_HDR_SIZE 12
#define VLAN_HDR_SIZE 4
#define ETHERTYPE_VLAN 0x8100
#define BYTE_SWAP_S(w) (\
(((w) & 0xff00) >> 8) | \
(((w) & 0x00ff) << 8))
#define DB_OFFSET_PF 0x10000
#define DB_OFFSET_VF 0x4000
#define DBC_MSG_IDX(idx) (\
((idx) << DBC_DBC_INDEX_SFT) & DBC_DBC_INDEX_MASK)
#define DBC_MSG_XID(xid, flg) (\
(((xid) << DBC_DBC_XID_SFT) & DBC_DBC_XID_MASK) | \
DBC_DBC_PATH_L2 | (FLAG_TEST ( bp->flags, BNXT_FLAG_IS_CHIP_P7 ) ? DBC_DBC_VALID : 0) | (flg))
#define DBC_MSG_EPCH(idx) (\
((idx) << DBC_DBC_EPOCH_SFT))
#define DBC_MSG_TOGGLE(idx) (\
((idx) << DBC_DBC_TOGGLE_SFT) & DBC_DBC_TOGGLE_MASK)
#define PHY_STATUS 0x0001
#define PHY_SPEED 0x0002
#define DETECT_MEDIA 0x0004
#define SUPPORT_SPEEDS 0x0008
#define SUPPORT_SPEEDS2 0x0010
#define QCFG_PHY_ALL (\
SUPPORT_SPEEDS | SUPPORT_SPEEDS2 | \
DETECT_MEDIA | PHY_SPEED | PHY_STATUS)
#define str_mbps "Mbps"
#define str_gbps "Gbps"
/*
* Broadcom ethernet driver nvm defines.
*/
/* nvm cfg 203 - u32 link_settings */
#define LINK_SPEED_DRV_NUM 203
#define LINK_SPEED_DRV_MASK 0x0000000F
#define LINK_SPEED_DRV_SHIFT 0
#define LINK_SPEED_DRV_AUTONEG 0x0
#define NS_LINK_SPEED_DRV_AUTONEG 0x0
#define LINK_SPEED_DRV_1G 0x1
#define NS_LINK_SPEED_DRV_1G 0x1
#define LINK_SPEED_DRV_10G 0x2
#define NS_LINK_SPEED_DRV_10G 0x2
#define LINK_SPEED_DRV_25G 0x3
#define NS_LINK_SPEED_DRV_25G 0x3
#define LINK_SPEED_DRV_40G 0x4
#define NS_LINK_SPEED_DRV_40G 0x4
#define LINK_SPEED_DRV_50G 0x5
#define NS_LINK_SPEED_DRV_50G 0x5
#define LINK_SPEED_DRV_100G 0x6
#define NS_LINK_SPEED_DRV_100G 0x6
#define LINK_SPEED_DRV_200G 0x7
#define NS_LINK_SPEED_DRV_200G 0x7
#define LINK_SPEED_DRV_2_5G 0xE
#define NS_LINK_SPEED_DRV_2_5G 0xE
#define LINK_SPEED_DRV_100M 0xF
#define NS_LINK_SPEED_DRV_100M 0xF
/* nvm cfg 201 - u32 speed_cap_mask */
#define SPEED_CAPABILITY_DRV_MASK 0x0000FFFF
#define SPEED_CAPABILITY_DRV_SHIFT 0
#define SPEED_CAPABILITY_DRV_1G 0x1
#define NS_SPEED_CAPABILITY_DRV_1G 0x1
#define SPEED_CAPABILITY_DRV_10G 0x2
#define NS_SPEED_CAPABILITY_DRV_10G 0x2
#define SPEED_CAPABILITY_DRV_25G 0x4
#define NS_SPEED_CAPABILITY_DRV_25G 0x4
#define SPEED_CAPABILITY_DRV_40G 0x8
#define NS_SPEED_CAPABILITY_DRV_40G 0x8
#define SPEED_CAPABILITY_DRV_50G 0x10
#define NS_SPEED_CAPABILITY_DRV_50G 0x10
#define SPEED_CAPABILITY_DRV_100G 0x20
#define NS_SPEED_CAPABILITY_DRV_100G 0x20
#define SPEED_CAPABILITY_DRV_200G 0x40
#define NS_SPEED_CAPABILITY_DRV_200G 0x40
#define SPEED_CAPABILITY_DRV_2_5G 0x4000
#define NS_SPEED_CAPABILITY_DRV_2_5G 0x4000
#define SPEED_CAPABILITY_DRV_100M 0x8000
#define NS_SPEED_CAPABILITY_DRV_100M 0x8000
/* nvm cfg 202 */
#define SPEED_CAPABILITY_FW_MASK 0xFFFF0000
#define SPEED_CAPABILITY_FW_SHIFT 16
#define SPEED_CAPABILITY_FW_1G (0x1L << 16)
#define NS_SPEED_CAPABILITY_FW_1G (0x1)
#define SPEED_CAPABILITY_FW_10G (0x2L << 16)
#define NS_SPEED_CAPABILITY_FW_10G (0x2)
#define SPEED_CAPABILITY_FW_25G (0x4L << 16)
#define NS_SPEED_CAPABILITY_FW_25G (0x4)
#define SPEED_CAPABILITY_FW_40G (0x8L << 16)
#define NS_SPEED_CAPABILITY_FW_40G (0x8)
#define SPEED_CAPABILITY_FW_50G (0x10L << 16)
#define NS_SPEED_CAPABILITY_FW_50G (0x10)
#define SPEED_CAPABILITY_FW_100G (0x20L << 16)
#define NS_SPEED_CAPABILITY_FW_100G (0x20)
#define SPEED_CAPABILITY_FW_200G (0x40L << 16)
#define NS_SPEED_CAPABILITY_FW_200G (0x40)
#define SPEED_CAPABILITY_FW_2_5G (0x4000L << 16)
#define NS_SPEED_CAPABILITY_FW_2_5G (0x4000)
#define SPEED_CAPABILITY_FW_100M (0x8000UL << 16)
#define NS_SPEED_CAPABILITY_FW_100M (0x8000)
/* nvm cfg 205 */
#define LINK_SPEED_FW_NUM 205
#define LINK_SPEED_FW_MASK 0x00000780
#define LINK_SPEED_FW_SHIFT 7
#define LINK_SPEED_FW_AUTONEG (0x0L << 7)
#define NS_LINK_SPEED_FW_AUTONEG (0x0)
#define LINK_SPEED_FW_1G (0x1L << 7)
#define NS_LINK_SPEED_FW_1G (0x1)
#define LINK_SPEED_FW_10G (0x2L << 7)
#define NS_LINK_SPEED_FW_10G (0x2)
#define LINK_SPEED_FW_25G (0x3L << 7)
#define NS_LINK_SPEED_FW_25G (0x3)
#define LINK_SPEED_FW_40G (0x4L << 7)
#define NS_LINK_SPEED_FW_40G (0x4)
#define LINK_SPEED_FW_50G (0x5L << 7)
#define NS_LINK_SPEED_FW_50G (0x5)
#define LINK_SPEED_FW_100G (0x6L << 7)
#define NS_LINK_SPEED_FW_100G (0x6)
#define LINK_SPEED_FW_200G (0x7L << 7)
#define NS_LINK_SPEED_FW_200G (0x7)
#define LINK_SPEED_FW_50G_PAM4 (0x8L << 7)
#define NS_LINK_SPEED_FW_50G_PAM4 (0x8)
#define LINK_SPEED_FW_100G_PAM4 (0x9L << 7)
#define NS_LINK_SPEED_FW_100G_PAM4 (0x9)
#define LINK_SPEED_FW_100G_PAM4_112 (0xAL << 7)
#define NS_LINK_SPEED_FW_100G_PAM4_112 (0xA)
#define LINK_SPEED_FW_200G_PAM4_112 (0xBL << 7)
#define NS_LINK_SPEED_FW_200G_PAM4_112 (0xB)
#define LINK_SPEED_FW_400G_PAM4 (0xCL << 7)
#define NS_LINK_SPEED_FW_400G_PAM4 (0xC)
#define LINK_SPEED_FW_400G_PAM4_112 (0xDL << 7)
#define NS_LINK_SPEED_FW_400G_PAM4_112 (0xD)
#define LINK_SPEED_FW_2_5G (0xEL << 7)
#define NS_LINK_SPEED_FW_2_5G (0xE)
#define LINK_SPEED_FW_100M (0xFL << 7)
#define NS_LINK_SPEED_FW_100M (0xF)
/* nvm cfg 210 */
#define D3_LINK_SPEED_FW_NUM 210
#define D3_LINK_SPEED_FW_MASK 0x000F0000
#define D3_LINK_SPEED_FW_SHIFT 16
#define D3_LINK_SPEED_FW_AUTONEG (0x0L << 16)
#define NS_D3_LINK_SPEED_FW_AUTONEG (0x0)
#define D3_LINK_SPEED_FW_1G (0x1L << 16)
#define NS_D3_LINK_SPEED_FW_1G (0x1)
#define D3_LINK_SPEED_FW_10G (0x2L << 16)
#define NS_D3_LINK_SPEED_FW_10G (0x2)
#define D3_LINK_SPEED_FW_25G (0x3L << 16)
#define NS_D3_LINK_SPEED_FW_25G (0x3)
#define D3_LINK_SPEED_FW_40G (0x4L << 16)
#define NS_D3_LINK_SPEED_FW_40G (0x4)
#define D3_LINK_SPEED_FW_50G (0x5L << 16)
#define NS_D3_LINK_SPEED_FW_50G (0x5)
#define D3_LINK_SPEED_FW_100G (0x6L << 16)
#define NS_D3_LINK_SPEED_FW_100G (0x6)
#define D3_LINK_SPEED_FW_200G (0x7L << 16)
#define NS_D3_LINK_SPEED_FW_200G (0x7)
#define D3_LINK_SPEED_FW_2_5G (0xEL << 16)
#define NS_D3_LINK_SPEED_FW_2_5G (0xE)
#define D3_LINK_SPEED_FW_100M (0xFL << 16)
#define NS_D3_LINK_SPEED_FW_100M (0xF)
/* nvm cfg 211 */
#define D3_FLOW_CONTROL_FW_NUM 211
#define D3_FLOW_CONTROL_FW_MASK 0x00700000
#define D3_FLOW_CONTROL_FW_SHIFT 20
#define D3_FLOW_CONTROL_FW_AUTO (0x0L << 20)
#define NS_D3_FLOW_CONTROL_FW_AUTO (0x0)
#define D3_FLOW_CONTROL_FW_TX (0x1L << 20)
#define NS_D3_FLOW_CONTROL_FW_TX (0x1)
#define D3_FLOW_CONTROL_FW_RX (0x2L << 20)
#define NS_D3_FLOW_CONTROL_FW_RX (0x2)
#define D3_FLOW_CONTROL_FW_BOTH (0x3L << 20)
#define NS_D3_FLOW_CONTROL_FW_BOTH (0x3)
#define D3_FLOW_CONTROL_FW_NONE (0x4L << 20)
#define NS_D3_FLOW_CONTROL_FW_NONE (0x4)
/* nvm cfg 213 */
#define PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_NUM 213
#define PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_MASK 0x02000000
#define PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_SHIFT 25
#define PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_DISABLED (0x0L << 25)
#define NS_PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_DISABLED (0x0)
#define PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_ENABLED (0x1L << 25)
#define NS_PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_ENABLED (0x1)
/* nvm cfg 357 - u32 mba_cfg2 */
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_VALUE_NUM 357
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_VALUE_MASK 0x0000FFFF
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_VALUE_SHIFT 0
/* nvm cfg 358 - u32 mba_cfg2 */
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_NUM 358
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_MASK 0x00010000
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_SHIFT 16
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_DISABLED (0x0L << 16)
#define NS_FUNC_CFG_PRE_BOOT_MBA_VLAN_DISABLED (0x0)
#define FUNC_CFG_PRE_BOOT_MBA_VLAN_ENABLED (0x1L << 16)
#define NS_FUNC_CFG_PRE_BOOT_MBA_VLAN_ENABLED (0x1)
struct tx_doorbell {
u32 key_idx;
#define TX_DOORBELL_IDX_MASK 0xffffffUL
#define TX_DOORBELL_IDX_SFT 0
#define TX_DOORBELL_KEY_MASK 0xf0000000UL
#define TX_DOORBELL_KEY_SFT 28
#define TX_DOORBELL_KEY_TX (0x0UL << 28)
#define TX_DOORBELL_KEY_LAST TX_DOORBELL_KEY_TX
};
struct rx_doorbell {
u32 key_idx;
#define RX_DOORBELL_IDX_MASK 0xffffffUL
#define RX_DOORBELL_IDX_SFT 0
#define RX_DOORBELL_KEY_MASK 0xf0000000UL
#define RX_DOORBELL_KEY_SFT 28
#define RX_DOORBELL_KEY_RX (0x1UL << 28)
#define RX_DOORBELL_KEY_LAST RX_DOORBELL_KEY_RX
};
struct cmpl_doorbell {
u32 key_mask_valid_idx;
#define CMPL_DOORBELL_IDX_MASK 0xffffffUL
#define CMPL_DOORBELL_IDX_SFT 0
#define CMPL_DOORBELL_IDX_VALID 0x4000000UL
#define CMPL_DOORBELL_MASK 0x8000000UL
#define CMPL_DOORBELL_KEY_MASK 0xf0000000UL
#define CMPL_DOORBELL_KEY_SFT 28
#define CMPL_DOORBELL_KEY_CMPL (0x2UL << 28)
#define CMPL_DOORBELL_KEY_LAST CMPL_DOORBELL_KEY_CMPL
};
/* dbc_dbc (size:64b/8B) */
struct dbc_dbc {
__le32 index;
#define DBC_DBC_INDEX_MASK 0xffffffUL
#define DBC_DBC_INDEX_SFT 0
#define DBC_DBC_EPOCH 0x1000000UL
#define DBC_DBC_EPOCH_SFT 24
#define DBC_DBC_TOGGLE_MASK 0x6000000UL
#define DBC_DBC_TOGGLE_SFT 25
__le32 type_path_xid;
#define DBC_DBC_XID_MASK 0xfffffUL
#define DBC_DBC_XID_SFT 0
#define DBC_DBC_PATH_MASK 0x3000000UL
#define DBC_DBC_PATH_SFT 24
#define DBC_DBC_PATH_ROCE (0x0UL << 24)
#define DBC_DBC_PATH_L2 (0x1UL << 24)
#define DBC_DBC_PATH_ENGINE (0x2UL << 24)
#define DBC_DBC_PATH_LAST DBC_DBC_PATH_ENGINE
#define DBC_DBC_VALID 0x4000000UL
#define DBC_DBC_DEBUG_TRACE 0x8000000UL
#define DBC_DBC_TYPE_MASK 0xf0000000UL
#define DBC_DBC_TYPE_SFT 28
#define DBC_DBC_TYPE_SQ (0x0UL << 28)
#define DBC_DBC_TYPE_RQ (0x1UL << 28)
#define DBC_DBC_TYPE_SRQ (0x2UL << 28)
#define DBC_DBC_TYPE_SRQ_ARM (0x3UL << 28)
#define DBC_DBC_TYPE_CQ (0x4UL << 28)
#define DBC_DBC_TYPE_CQ_ARMSE (0x5UL << 28)
#define DBC_DBC_TYPE_CQ_ARMALL (0x6UL << 28)
#define DBC_DBC_TYPE_CQ_ARMENA (0x7UL << 28)
#define DBC_DBC_TYPE_SRQ_ARMENA (0x8UL << 28)
#define DBC_DBC_TYPE_CQ_CUTOFF_ACK (0x9UL << 28)
#define DBC_DBC_TYPE_NQ (0xaUL << 28)
#define DBC_DBC_TYPE_NQ_ARM (0xbUL << 28)
#define DBC_DBC_TYPE_NULL (0xfUL << 28)
#define DBC_DBC_TYPE_LAST DBC_DBC_TYPE_NULL
};
/*******************************************************************************
* Transmit info.
*****************************************************************************/
struct tx_bd_short {
u16 flags_type;
#define TX_BD_SHORT_TYPE_MASK 0x3fUL
#define TX_BD_SHORT_TYPE_SFT 0
#define TX_BD_SHORT_TYPE_TX_BD_SHORT 0x0UL
#define TX_BD_SHORT_TYPE_LAST TX_BD_SHORT_TYPE_TX_BD_SHORT
#define TX_BD_SHORT_FLAGS_MASK 0xffc0UL
#define TX_BD_SHORT_FLAGS_SFT 6
#define TX_BD_SHORT_FLAGS_PACKET_END 0x40UL
#define TX_BD_SHORT_FLAGS_NO_CMPL 0x80UL
#define TX_BD_SHORT_FLAGS_BD_CNT_MASK 0x1f00UL
#define TX_BD_SHORT_FLAGS_BD_CNT_SFT 8
#define TX_BD_SHORT_FLAGS_LHINT_MASK 0x6000UL
#define TX_BD_SHORT_FLAGS_LHINT_SFT 13
#define TX_BD_SHORT_FLAGS_LHINT_LT512 (0x0UL << 13)
#define TX_BD_SHORT_FLAGS_LHINT_LT1K (0x1UL << 13)
#define TX_BD_SHORT_FLAGS_LHINT_LT2K (0x2UL << 13)
#define TX_BD_SHORT_FLAGS_LHINT_GTE2K (0x3UL << 13)
#define TX_BD_SHORT_FLAGS_LHINT_LAST TX_BD_SHORT_FLAGS_LHINT_GTE2K
#define TX_BD_SHORT_FLAGS_COAL_NOW 0x8000UL
u16 len;
u32 opaque;
union dma_addr64_t dma;
};
struct tx_cmpl {
u16 flags_type;
#define TX_CMPL_TYPE_MASK 0x3fUL
#define TX_CMPL_TYPE_SFT 0
#define TX_CMPL_TYPE_TX_L2 0x0UL
#define TX_CMPL_TYPE_LAST TX_CMPL_TYPE_TX_L2
#define TX_CMPL_FLAGS_MASK 0xffc0UL
#define TX_CMPL_FLAGS_SFT 6
#define TX_CMPL_FLAGS_ERROR 0x40UL
#define TX_CMPL_FLAGS_PUSH 0x80UL
u16 unused_0;
u32 opaque;
u16 errors_v;
#define TX_CMPL_V 0x1UL
#define TX_CMPL_ERRORS_MASK 0xfffeUL
#define TX_CMPL_ERRORS_SFT 1
#define TX_CMPL_ERRORS_BUFFER_ERROR_MASK 0xeUL
#define TX_CMPL_ERRORS_BUFFER_ERROR_SFT 1
#define TX_CMPL_ERRORS_BUFFER_ERROR_NO_ERROR (0x0UL << 1)
#define TX_CMPL_ERRORS_BUFFER_ERROR_BAD_FMT (0x2UL << 1)
#define TX_CMPL_ERRORS_BUFFER_ERROR_LAST TX_CMPL_ERRORS_BUFFER_ERROR_BAD_FMT
#define TX_CMPL_ERRORS_ZERO_LENGTH_PKT 0x10UL
#define TX_CMPL_ERRORS_EXCESSIVE_BD_LENGTH 0x20UL
#define TX_CMPL_ERRORS_DMA_ERROR 0x40UL
#define TX_CMPL_ERRORS_HINT_TOO_SHORT 0x80UL
#define TX_CMPL_ERRORS_POISON_TLP_ERROR 0x100UL
u16 unused_1;
u32 unused_2;
};
struct tx_info {
void *bd_virt;
struct io_buffer *iob[MAX_TX_DESC_CNT];
u16 prod_id; /* Tx producer index. */
u16 cons_id;
u16 ring_cnt;
u32 cnt; /* Tx statistics. */
u32 cnt_req;
u8 epoch;
u8 res[3];
};
struct cmpl_base {
u16 type;
#define CMPL_BASE_TYPE_MASK 0x3fUL
#define CMPL_BASE_TYPE_SFT 0
#define CMPL_BASE_TYPE_TX_L2 0x0UL
#define CMPL_BASE_TYPE_RX_L2 0x11UL
#define CMPL_BASE_TYPE_RX_AGG 0x12UL
#define CMPL_BASE_TYPE_RX_TPA_START 0x13UL
#define CMPL_BASE_TYPE_RX_TPA_END 0x15UL
#define CMPL_BASE_TYPE_RX_L2_V3 0x17UL
#define CMPL_BASE_TYPE_STAT_EJECT 0x1aUL
#define CMPL_BASE_TYPE_HWRM_DONE 0x20UL
#define CMPL_BASE_TYPE_HWRM_FWD_REQ 0x22UL
#define CMPL_BASE_TYPE_HWRM_FWD_RESP 0x24UL
#define CMPL_BASE_TYPE_HWRM_ASYNC_EVENT 0x2eUL
#define CMPL_BASE_TYPE_CQ_NOTIFICATION 0x30UL
#define CMPL_BASE_TYPE_SRQ_EVENT 0x32UL
#define CMPL_BASE_TYPE_DBQ_EVENT 0x34UL
#define CMPL_BASE_TYPE_QP_EVENT 0x38UL
#define CMPL_BASE_TYPE_FUNC_EVENT 0x3aUL
#define CMPL_BASE_TYPE_LAST CMPL_BASE_TYPE_FUNC_EVENT
u16 info1;
u32 info2;
u32 info3_v;
#define CMPL_BASE_V 0x1UL
#define CMPL_BASE_INFO3_MASK 0xfffffffeUL
#define CMPL_BASE_INFO3_SFT 1
u32 info4;
};
struct cmp_info {
void *bd_virt;
u16 cons_id;
u16 ring_cnt;
u8 completion_bit;
u8 epoch;
u8 res[2];
};
/* Completion Queue Notification */
/* nq_cn (size:128b/16B) */
struct nq_base {
u16 type;
/*
* This field indicates the exact type of the completion.
* By convention, the LSB identifies the length of the
* record in 16B units. Even values indicate 16B
* records. Odd values indicate 32B
* records.
*/
#define NQ_CN_TYPE_MASK 0x3fUL
#define NQ_CN_TYPE_SFT 0
#define NQ_CN_TOGGLE_MASK 0xc0UL
#define NQ_CN_TOGGLE_SFT 6
/* CQ Notification */
#define NQ_CN_TYPE_CQ_NOTIFICATION 0x30UL
#define NQ_CN_TYPE_LAST NQ_CN_TYPE_CQ_NOTIFICATION
u16 reserved16;
/*
* This is an application level ID used to identify the
* CQ. This field carries the lower 32b of the value.
*/
u32 cq_handle_low;
u32 v;
/*
* This value is written by the NIC such that it will be different
* for each pass through the completion queue. The even passes
* will write 1. The odd passes will write 0.
*/
#define NQ_CN_V 0x1UL
/*
* This is an application level ID used to identify the
* CQ. This field carries the upper 32b of the value.
*/
u32 cq_handle_high;
};
struct nq_info {
void *bd_virt;
u16 cons_id;
u16 ring_cnt;
u8 completion_bit;
u8 epoch;
u8 toggle;
u8 res[1];
};
struct rx_pkt_cmpl {
u16 flags_type;
#define RX_PKT_CMPL_TYPE_MASK 0x3fUL
#define RX_PKT_CMPL_TYPE_SFT 0
#define RX_PKT_CMPL_TYPE_RX_L2 0x11UL
#define RX_PKT_CMPL_TYPE_LAST RX_PKT_CMPL_TYPE_RX_L2
#define RX_PKT_CMPL_FLAGS_MASK 0xffc0UL
#define RX_PKT_CMPL_FLAGS_SFT 6
#define RX_PKT_CMPL_FLAGS_ERROR 0x40UL
#define RX_PKT_CMPL_FLAGS_PLACEMENT_MASK 0x380UL
#define RX_PKT_CMPL_FLAGS_PLACEMENT_SFT 7
#define RX_PKT_CMPL_FLAGS_PLACEMENT_NORMAL (0x0UL << 7)
#define RX_PKT_CMPL_FLAGS_PLACEMENT_JUMBO (0x1UL << 7)
#define RX_PKT_CMPL_FLAGS_PLACEMENT_HDS (0x2UL << 7)
#define RX_PKT_CMPL_FLAGS_PLACEMENT_LAST RX_PKT_CMPL_FLAGS_PLACEMENT_HDS
#define RX_PKT_CMPL_FLAGS_RSS_VALID 0x400UL
#define RX_PKT_CMPL_FLAGS_UNUSED 0x800UL
#define RX_PKT_CMPL_FLAGS_ITYPE_MASK 0xf000UL
#define RX_PKT_CMPL_FLAGS_ITYPE_SFT 12
#define RX_PKT_CMPL_FLAGS_ITYPE_NOT_KNOWN (0x0UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_IP (0x1UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_TCP (0x2UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_UDP (0x3UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_FCOE (0x4UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_ROCE (0x5UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_ICMP (0x7UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_PTP_WO_TIMESTAMP (0x8UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_PTP_W_TIMESTAMP (0x9UL << 12)
#define RX_PKT_CMPL_FLAGS_ITYPE_LAST RX_PKT_CMPL_FLAGS_ITYPE_PTP_W_TIMESTAMP
u16 len;
u32 opaque;
u8 agg_bufs_v1;
#define RX_PKT_CMPL_V1 0x1UL
#define RX_PKT_CMPL_AGG_BUFS_MASK 0x3eUL
#define RX_PKT_CMPL_AGG_BUFS_SFT 1
#define RX_PKT_CMPL_UNUSED1_MASK 0xc0UL
#define RX_PKT_CMPL_UNUSED1_SFT 6
u8 rss_hash_type;
u8 payload_offset;
u8 unused1;
u32 rss_hash;
};
struct rx_pkt_cmpl_hi {
u32 flags2;
#define RX_PKT_CMPL_FLAGS2_IP_CS_CALC 0x1UL
#define RX_PKT_CMPL_FLAGS2_L4_CS_CALC 0x2UL
#define RX_PKT_CMPL_FLAGS2_T_IP_CS_CALC 0x4UL
#define RX_PKT_CMPL_FLAGS2_T_L4_CS_CALC 0x8UL
#define RX_PKT_CMPL_FLAGS2_META_FORMAT_MASK 0xf0UL
#define RX_PKT_CMPL_FLAGS2_META_FORMAT_SFT 4
#define RX_PKT_CMPL_FLAGS2_META_FORMAT_NONE (0x0UL << 4)
#define RX_PKT_CMPL_FLAGS2_META_FORMAT_VLAN (0x1UL << 4)
#define RX_PKT_CMPL_FLAGS2_META_FORMAT_LAST \
RX_PKT_CMPL_FLAGS2_META_FORMAT_VLAN
#define RX_PKT_CMPL_FLAGS2_IP_TYPE 0x100UL
u32 metadata;
#define RX_PKT_CMPL_METADATA_VID_MASK 0xfffUL
#define RX_PKT_CMPL_METADATA_VID_SFT 0
#define RX_PKT_CMPL_METADATA_DE 0x1000UL
#define RX_PKT_CMPL_METADATA_PRI_MASK 0xe000UL
#define RX_PKT_CMPL_METADATA_PRI_SFT 13
#define RX_PKT_CMPL_METADATA_TPID_MASK 0xffff0000UL
#define RX_PKT_CMPL_METADATA_TPID_SFT 16
u16 errors_v2;
#define RX_PKT_CMPL_V2 0x1UL
#define RX_PKT_CMPL_ERRORS_MASK 0xfffeUL
#define RX_PKT_CMPL_ERRORS_SFT 1
#define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_MASK 0xeUL
#define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_SFT 1
#define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_NO_BUFFER (0x0UL << 1)
#define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_DID_NOT_FIT (0x1UL << 1)
#define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_NOT_ON_CHIP (0x2UL << 1)
#define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_BAD_FORMAT (0x3UL << 1)
#define RX_PKT_CMPL_ERRORS_BUFFER_ERROR_LAST \
RX_PKT_CMPL_ERRORS_BUFFER_ERROR_BAD_FORMAT
#define RX_PKT_CMPL_ERRORS_IP_CS_ERROR 0x10UL
#define RX_PKT_CMPL_ERRORS_L4_CS_ERROR 0x20UL
#define RX_PKT_CMPL_ERRORS_T_IP_CS_ERROR 0x40UL
#define RX_PKT_CMPL_ERRORS_T_L4_CS_ERROR 0x80UL
#define RX_PKT_CMPL_ERRORS_CRC_ERROR 0x100UL
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_MASK 0xe00UL
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_SFT 9
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_NO_ERROR (0x0UL << 9)
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_VERSION (0x1UL << 9)
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_HDR_LEN (0x2UL << 9)
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_TUNNEL_TOTAL_ERROR (0x3UL << 9)
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_IP_TOTAL_ERROR (0x4UL << 9)
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_UDP_TOTAL_ERROR (0x5UL << 9)
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL (0x6UL << 9)
#define RX_PKT_CMPL_ERRORS_T_PKT_ERROR_LAST \
RX_PKT_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_MASK 0xf000UL
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_SFT 12
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_NO_ERROR (0x0UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_L3_BAD_VERSION (0x1UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_L3_BAD_HDR_LEN (0x2UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_L3_BAD_TTL (0x3UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_IP_TOTAL_ERROR (0x4UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_UDP_TOTAL_ERROR (0x5UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN (0x6UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN_TOO_SMALL (0x7UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN (0x8UL << 12)
#define RX_PKT_CMPL_ERRORS_PKT_ERROR_LAST \
RX_PKT_CMPL_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN
u16 cfa_code;
u32 reorder;
#define RX_PKT_CMPL_REORDER_MASK 0xffffffUL
#define RX_PKT_CMPL_REORDER_SFT 0
};
struct rx_pkt_v3_cmpl {
u16 flags_type;
#define RX_PKT_V3_CMPL_TYPE_MASK 0x3fUL
#define RX_PKT_V3_CMPL_TYPE_SFT 0
/*
* RX L2 V3 completion:
* Completion of and L2 RX packet. Length = 32B
* This is the new version of the RX_L2 completion used in Thor2
* and later chips.
*/
#define RX_PKT_V3_CMPL_TYPE_RX_L2_V3 0x17UL
#define RX_PKT_V3_CMPL_TYPE_LAST RX_PKT_V3_CMPL_TYPE_RX_L2_V3
#define RX_PKT_V3_CMPL_FLAGS_MASK 0xffc0UL
#define RX_PKT_V3_CMPL_FLAGS_SFT 6
#define RX_PKT_V3_CMPL_FLAGS_ERROR 0x40UL
#define RX_PKT_V3_CMPL_FLAGS_PLACEMENT_MASK 0x380UL
#define RX_PKT_V3_CMPL_FLAGS_PLACEMENT_SFT 7
#define RX_PKT_V3_CMPL_FLAGS_PLACEMENT_NORMAL (0x0UL << 7)
#define RX_PKT_V3_CMPL_FLAGS_PLACEMENT_JUMBO (0x1UL << 7)
#define RX_PKT_V3_CMPL_FLAGS_PLACEMENT_HDS (0x2UL << 7)
#define RX_PKT_V3_CMPL_FLAGS_PLACEMENT_TRUNCATION (0x3UL << 7)
#define RX_PKT_V3_CMPL_FLAGS_PLACEMENT_LAST RX_PKT_V3_CMPL_FLAGS_PLACEMENT_TRUNCATION
#define RX_PKT_V3_CMPL_FLAGS_RSS_VALID 0x400UL
#define RX_PKT_V3_CMPL_FLAGS_PKT_METADATA_PRESENT 0x800UL
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_MASK 0xf000UL
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_SFT 12
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_NOT_KNOWN (0x0UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_IP (0x1UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_TCP (0x2UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_UDP (0x3UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_FCOE (0x4UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_ROCE (0x5UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_ICMP (0x7UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_PTP_WO_TIMESTAMP (0x8UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_PTP_W_TIMESTAMP (0x9UL << 12)
#define RX_PKT_V3_CMPL_FLAGS_ITYPE_LAST RX_PKT_V3_CMPL_FLAGS_ITYPE_PTP_W_TIMESTAMP
u16 len;
u32 opaque;
u16 rss_hash_type_agg_bufs_v1;
#define RX_PKT_V3_CMPL_V1 0x1UL
#define RX_PKT_V3_CMPL_AGG_BUFS_MASK 0x3eUL
#define RX_PKT_V3_CMPL_AGG_BUFS_SFT 1
#define RX_PKT_V3_CMPL_UNUSED1 0x40UL
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_MASK 0xff80UL
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_SFT 7
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_0 (0x0UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_1 (0x1UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_3 (0x3UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_4 (0x4UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_5 (0x5UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_6 (0x6UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_7 (0x7UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_8 (0x8UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_9 (0x9UL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_10 (0xaUL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_11 (0xbUL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_12 (0xcUL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_13 (0xdUL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_14 (0xeUL << 7)
#define RX_PKT_V3_CMPL_RSS_HASH_TYPE_LAST RX_PKT_V3_CMPL_RSS_HASH_TYPE_ENUM_14
u16 metadata1_payload_offset;
#define RX_PKT_V3_CMPL_PAYLOAD_OFFSET_MASK 0x1ffUL
#define RX_PKT_V3_CMPL_PAYLOAD_OFFSET_SFT 0
#define RX_PKT_V3_CMPL_METADATA1_MASK 0xf000UL
#define RX_PKT_V3_CMPL_METADATA1_SFT 12
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_MASK 0x7000UL
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_SFT 12
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_TPID88A8 (0x0UL << 12)
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_TPID8100 (0x1UL << 12)
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_TPID9100 (0x2UL << 12)
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_TPID9200 (0x3UL << 12)
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_TPID9300 (0x4UL << 12)
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_TPIDCFG (0x5UL << 12)
#define RX_PKT_V3_CMPL_METADATA1_TPID_SEL_LAST RX_PKT_V3_CMPL_METADATA1_TPID_SEL_TPIDCFG
#define RX_PKT_V3_CMPL_METADATA1_VALID 0x8000UL
u32 rss_hash;
};
struct rx_pkt_v3_cmpl_hi {
u32 flags2;
#define RX_PKT_V3_CMPL_HI_FLAGS2_IP_CS_CALC 0x1UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_L4_CS_CALC 0x2UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_T_IP_CS_CALC 0x4UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_T_L4_CS_CALC 0x8UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_MASK 0xf0UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_SFT 4
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_NONE (0x0UL << 4)
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_ACT_REC_PTR (0x1UL << 4)
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_TUNNEL_ID (0x2UL << 4)
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_CHDR_DATA (0x3UL << 4)
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_HDR_OFFSET (0x4UL << 4)
#define RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_LAST RX_PKT_V3_CMPL_HI_FLAGS2_META_FORMAT_HDR_OFFSET
#define RX_PKT_V3_CMPL_HI_FLAGS2_IP_TYPE 0x100UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_COMPLETE_CHECKSUM_CALC 0x200UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_T_IP_TYPE 0x400UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_T_IP_TYPE_IPV4 (0x0UL << 10)
#define RX_PKT_V3_CMPL_HI_FLAGS2_T_IP_TYPE_IPV6 (0x1UL << 10)
#define RX_PKT_V3_CMPL_HI_FLAGS2_T_IP_TYPE_LAST RX_PKT_V3_CMPL_HI_FLAGS2_T_IP_TYPE_IPV6
#define RX_PKT_V3_CMPL_HI_FLAGS2_COMPLETE_CHECKSUM_MASK 0xffff0000UL
#define RX_PKT_V3_CMPL_HI_FLAGS2_COMPLETE_CHECKSUM_SFT 16
u32 metadata2;
u16 errors_v2;
#define RX_PKT_V3_CMPL_HI_V2 0x1UL
#define RX_PKT_V3_CMPL_HI_ERRORS_MASK 0xfffeUL
#define RX_PKT_V3_CMPL_HI_ERRORS_SFT 1
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_MASK 0xeUL
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_SFT 1
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_NO_BUFFER (0x0UL << 1)
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_DID_NOT_FIT (0x1UL << 1)
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_NOT_ON_CHIP (0x2UL << 1)
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_BAD_FORMAT (0x3UL << 1)
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_FLUSH (0x5UL << 1)
#define RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_LAST RX_PKT_V3_CMPL_HI_ERRORS_BUFFER_ERROR_FLUSH
#define RX_PKT_V3_CMPL_HI_ERRORS_IP_CS_ERROR 0x10UL
#define RX_PKT_V3_CMPL_HI_ERRORS_L4_CS_ERROR 0x20UL
#define RX_PKT_V3_CMPL_HI_ERRORS_T_IP_CS_ERROR 0x40UL
#define RX_PKT_V3_CMPL_HI_ERRORS_T_L4_CS_ERROR 0x80UL
#define RX_PKT_V3_CMPL_HI_ERRORS_CRC_ERROR 0x100UL
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_MASK 0xe00UL
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_SFT 9
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_NO_ERROR (0x0UL << 9)
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_T_L3_BAD_VERSION (0x1UL << 9)
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_T_L3_BAD_HDR_LEN (0x2UL << 9)
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_T_IP_TOTAL_ERROR (0x3UL << 9)
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_T_UDP_TOTAL_ERROR (0x4UL << 9)
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL (0x5UL << 9)
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_T_TOTAL_ERROR (0x6UL << 9)
#define RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_LAST RX_PKT_V3_CMPL_HI_ERRORS_T_PKT_ERROR_T_TOTAL_ERROR
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_MASK 0xf000UL
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_SFT 12
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_NO_ERROR (0x0UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_L3_BAD_VERSION (0x1UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_L3_BAD_HDR_LEN (0x2UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_L3_BAD_TTL (0x3UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_IP_TOTAL_ERROR (0x4UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_UDP_TOTAL_ERROR (0x5UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN (0x6UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN_TOO_SMALL (0x7UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN (0x8UL << 12)
#define RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_LAST RX_PKT_V3_CMPL_HI_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN
u16 metadata0;
#define RX_PKT_V3_CMPL_HI_METADATA0_VID_MASK 0xfffUL
#define RX_PKT_V3_CMPL_HI_METADATA0_VID_SFT 0
#define RX_PKT_V3_CMPL_HI_METADATA0_DE 0x1000UL
/* When meta_format=1, this value is the VLAN PRI. */
#define RX_PKT_V3_CMPL_HI_METADATA0_PRI_MASK 0xe000UL
#define RX_PKT_V3_CMPL_HI_METADATA0_PRI_SFT 13
u32 timestamp;
};
struct rx_prod_pkt_bd {
u16 flags_type;
#define RX_PROD_PKT_BD_TYPE_MASK 0x3fUL
#define RX_PROD_PKT_BD_TYPE_SFT 0
#define RX_PROD_PKT_BD_TYPE_RX_PROD_PKT 0x4UL
#define RX_PROD_PKT_BD_TYPE_LAST RX_PROD_PKT_BD_TYPE_RX_PROD_PKT
#define RX_PROD_PKT_BD_FLAGS_MASK 0xffc0UL
#define RX_PROD_PKT_BD_FLAGS_SFT 6
#define RX_PROD_PKT_BD_FLAGS_SOP_PAD 0x40UL
#define RX_PROD_PKT_BD_FLAGS_EOP_PAD 0x80UL
#define RX_PROD_PKT_BD_FLAGS_BUFFERS_MASK 0x300UL
#define RX_PROD_PKT_BD_FLAGS_BUFFERS_SFT 8
u16 len;
u32 opaque;
union dma_addr64_t dma;
};
struct rx_info {
void *bd_virt;
struct io_buffer *iob[NUM_RX_BUFFERS];
u16 iob_cnt;
u16 buf_cnt; /* Total Rx buffer descriptors. */
u16 ring_cnt;
u16 cons_id; /* Last processed consumer index. */
/* Receive statistics. */
u32 cnt;
u32 good;
u32 drop_err;
u32 drop_lb;
u32 drop_vlan;
u8 epoch;
u8 res[3];
};
#define VALID_DRIVER_REG 0x0001
#define VALID_STAT_CTX 0x0002
#define VALID_RING_CQ 0x0004
#define VALID_RING_TX 0x0008
#define VALID_RING_RX 0x0010
#define VALID_RING_GRP 0x0020
#define VALID_VNIC_ID 0x0040
#define VALID_RX_IOB 0x0080
#define VALID_L2_FILTER 0x0100
#define VALID_RING_NQ 0x0200
struct bnxt {
/* begin "general, frequently-used members" cacheline section */
/* If the IRQ handler (which runs lockless) needs to be
* quiesced, the following bitmask state is used. The
* SYNC flag is set by non-IRQ context code to initiate
* the quiescence.
*
* When the IRQ handler notices that SYNC is set, it
* disables interrupts and returns.
*
* When all outstanding IRQ handlers have returned after
* the SYNC flag has been set, the setter can be assured
* that interrupts will no longer get run.
*
* In this way all SMP driver locks are never acquired
* in hw IRQ context, only sw IRQ context or lower.
*/
unsigned int irq_sync;
struct net_device *dev;
struct pci_device *pdev;
void *hwrm_addr_req;
void *hwrm_addr_resp;
void *hwrm_addr_dma;
dma_addr_t req_addr_mapping;
dma_addr_t resp_addr_mapping;
dma_addr_t dma_addr_mapping;
struct tx_info tx; /* Tx info. */
struct rx_info rx; /* Rx info. */
struct cmp_info cq; /* completion info. */
struct nq_info nq; /* completion info. */
u16 nq_ring_id;
u8 queue_id;
u16 last_resp_code;
u16 seq_id;
u32 flag_hwrm;
u32 flags;
/* PCI info. */
u16 subsystem_vendor;
u16 subsystem_device;
u16 cmd_reg;
u8 pf_num; /* absolute PF number */
u8 vf;
void *bar0;
void *bar1;
void *bar2;
/* Device info. */
u16 chip_num;
/* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */
u32 chip_id;
u32 hwrm_cmd_timeout;
u16 hwrm_spec_code;
u16 hwrm_max_req_len;
u16 hwrm_max_ext_req_len;
u8 mac_addr[ETH_ALEN]; /* HW MAC address */
u16 fid;
u8 port_idx;
u8 ordinal_value;
u16 mtu;
u16 ring_grp_id;
u16 cq_ring_id;
u16 tx_ring_id;
u16 rx_ring_id;
u16 current_link_speed;
u16 link_status;
u16 wait_link_timeout;
u64 l2_filter_id;
u16 vnic_id;
u16 stat_ctx_id;
u16 vlan_id;
u16 vlan_tx;
u32 mba_cfg2;
u32 medium;
u16 support_speeds;
u16 auto_link_speeds2_mask;
u32 link_set;
u8 media_detect;
u8 rsvd;
u16 max_vfs;
u16 vf_res_strategy;
u16 min_vnics;
u16 max_vnics;
u16 max_msix;
u16 min_hw_ring_grps;
u16 max_hw_ring_grps;
u16 min_tx_rings;
u16 max_tx_rings;
u16 min_rx_rings;
u16 max_rx_rings;
u16 min_cp_rings;
u16 max_cp_rings;
u16 min_rsscos_ctxs;
u16 max_rsscos_ctxs;
u16 min_l2_ctxs;
u16 max_l2_ctxs;
u16 min_stat_ctxs;
u16 max_stat_ctxs;
u16 num_cmpl_rings;
u16 num_tx_rings;
u16 num_rx_rings;
u16 num_stat_ctxs;
u16 num_hw_ring_grps;
};
/* defines required to rsolve checkpatch errors / warnings */
#define test_if if
#define write32 writel
#define write64 writeq
#define pci_read_byte pci_read_config_byte
#define pci_read_word16 pci_read_config_word
#define pci_write_word pci_write_config_word
#define SHORT_CMD_SUPPORTED VER_GET_RESP_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED
#define SHORT_CMD_REQUIRED VER_GET_RESP_DEV_CAPS_CFG_SHORT_CMD_REQUIRED
#define CQ_DOORBELL_KEY_MASK(a) (\
CMPL_DOORBELL_KEY_CMPL | \
CMPL_DOORBELL_IDX_VALID | \
CMPL_DOORBELL_MASK | \
(u32)(a))
#define CQ_DOORBELL_KEY_IDX(a) (\
CMPL_DOORBELL_KEY_CMPL | \
CMPL_DOORBELL_IDX_VALID | \
(u32)(a))
#define TX_BD_FLAGS (\
TX_BD_SHORT_TYPE_TX_BD_SHORT |\
TX_BD_SHORT_FLAGS_COAL_NOW |\
TX_BD_SHORT_FLAGS_PACKET_END |\
(1 << TX_BD_SHORT_FLAGS_BD_CNT_SFT))
#define PORT_PHY_FLAGS (\
BNXT_FLAG_NPAR_MODE | \
BNXT_FLAG_MULTI_HOST)
#define RING_FREE(bp, rid, flag) bnxt_hwrm_ring_free(bp, rid, flag)
#define SET_LINK(p, m, s) ((p & (m >> s)) << s)
#define SET_MBA(p, m, s) ((p & (m >> s)) << s)
#define SPEED_DRV_MASK LINK_SPEED_DRV_MASK
#define SPEED_DRV_SHIFT LINK_SPEED_DRV_SHIFT
#define SPEED_FW_MASK LINK_SPEED_FW_MASK
#define SPEED_FW_SHIFT LINK_SPEED_FW_SHIFT
#define D3_SPEED_FW_MASK D3_LINK_SPEED_FW_MASK
#define D3_SPEED_FW_SHIFT D3_LINK_SPEED_FW_SHIFT
#define MEDIA_AUTO_DETECT_MASK PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_MASK
#define MEDIA_AUTO_DETECT_SHIFT PORT_CFG_LINK_SETTINGS_MEDIA_AUTO_DETECT_SHIFT
#define VLAN_MASK FUNC_CFG_PRE_BOOT_MBA_VLAN_MASK
#define VLAN_SHIFT FUNC_CFG_PRE_BOOT_MBA_VLAN_SHIFT
#define VLAN_VALUE_MASK FUNC_CFG_PRE_BOOT_MBA_VLAN_VALUE_MASK
#define VLAN_VALUE_SHIFT FUNC_CFG_PRE_BOOT_MBA_VLAN_VALUE_SHIFT
#define VF_CFG_ENABLE_FLAGS (\
FUNC_VF_CFG_REQ_ENABLES_MTU | \
FUNC_VF_CFG_REQ_ENABLES_GUEST_VLAN | \
FUNC_VF_CFG_REQ_ENABLES_ASYNC_EVENT_CR | \
FUNC_VF_CFG_REQ_ENABLES_DFLT_MAC_ADDR)
#define CHIP_NUM_57508 0x1750
#define CHIP_NUM_57504 0x1751
#define CHIP_NUM_57502 0x1752
#define CHIP_NUM_57608 0x1760