/* * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef __NES_HW_H #define __NES_HW_H #define NES_PHY_TYPE_CX4 1 #define NES_PHY_TYPE_1G 2 #define NES_PHY_TYPE_ARGUS 4 #define NES_PHY_TYPE_PUMA_1G 5 #define NES_PHY_TYPE_PUMA_10G 6 #define NES_PHY_TYPE_GLADIUS 7 #define NES_PHY_TYPE_SFP_D 8 #define NES_PHY_TYPE_KR 9 #define NES_MULTICAST_PF_MAX 8 #define NES_A0 3 #define NES_ENABLE_PAU 0x07000001 #define NES_DISABLE_PAU 0x07000000 #define NES_PAU_COUNTER 10 #define NES_CQP_OPCODE_MASK 0x3f enum pci_regs { NES_INT_STAT = 0x0000, NES_INT_MASK = 0x0004, NES_INT_PENDING = 0x0008, NES_INTF_INT_STAT = 0x000C, NES_INTF_INT_MASK = 0x0010, NES_TIMER_STAT = 0x0014, NES_PERIODIC_CONTROL = 0x0018, NES_ONE_SHOT_CONTROL = 0x001C, NES_EEPROM_COMMAND = 0x0020, NES_EEPROM_DATA = 0x0024, NES_FLASH_COMMAND = 0x0028, NES_FLASH_DATA = 0x002C, NES_SOFTWARE_RESET = 0x0030, NES_CQ_ACK = 0x0034, NES_WQE_ALLOC = 0x0040, NES_CQE_ALLOC = 0x0044, NES_AEQ_ALLOC = 0x0048 }; enum indexed_regs { NES_IDX_CREATE_CQP_LOW = 0x0000, NES_IDX_CREATE_CQP_HIGH = 0x0004, NES_IDX_QP_CONTROL = 0x0040, NES_IDX_FLM_CONTROL = 0x0080, NES_IDX_INT_CPU_STATUS = 0x00a0, NES_IDX_GPR_TRIGGER = 0x00bc, NES_IDX_GPIO_CONTROL = 0x00f0, NES_IDX_GPIO_DATA = 0x00f4, NES_IDX_GPR2 = 0x010c, NES_IDX_TCP_CONFIG0 = 0x01e4, NES_IDX_TCP_TIMER_CONFIG = 0x01ec, NES_IDX_TCP_NOW = 0x01f0, NES_IDX_QP_MAX_CFG_SIZES = 0x0200, NES_IDX_QP_CTX_SIZE = 0x0218, NES_IDX_TCP_TIMER_SIZE0 = 0x0238, NES_IDX_TCP_TIMER_SIZE1 = 0x0240, NES_IDX_ARP_CACHE_SIZE = 0x0258, NES_IDX_CQ_CTX_SIZE = 0x0260, NES_IDX_MRT_SIZE = 0x0278, NES_IDX_PBL_REGION_SIZE = 0x0280, NES_IDX_IRRQ_COUNT = 0x02b0, NES_IDX_RX_WINDOW_BUFFER_PAGE_TABLE_SIZE = 0x02f0, NES_IDX_RX_WINDOW_BUFFER_SIZE = 0x0300, NES_IDX_DST_IP_ADDR = 0x0400, NES_IDX_PCIX_DIAG = 0x08e8, NES_IDX_MPP_DEBUG = 0x0a00, NES_IDX_PORT_RX_DISCARDS = 0x0a30, NES_IDX_PORT_TX_DISCARDS = 0x0a34, NES_IDX_MPP_LB_DEBUG = 0x0b00, NES_IDX_DENALI_CTL_22 = 0x1058, NES_IDX_MAC_TX_CONTROL = 0x2000, NES_IDX_MAC_TX_CONFIG = 0x2004, NES_IDX_MAC_TX_PAUSE_QUANTA = 0x2008, NES_IDX_MAC_RX_CONTROL = 0x200c, NES_IDX_MAC_RX_CONFIG = 0x2010, NES_IDX_MAC_EXACT_MATCH_BOTTOM = 0x201c, NES_IDX_MAC_MDIO_CONTROL = 0x2084, NES_IDX_MAC_TX_OCTETS_LOW = 0x2100, NES_IDX_MAC_TX_OCTETS_HIGH = 0x2104, NES_IDX_MAC_TX_FRAMES_LOW = 0x2108, NES_IDX_MAC_TX_FRAMES_HIGH = 0x210c, NES_IDX_MAC_TX_PAUSE_FRAMES = 0x2118, NES_IDX_MAC_TX_ERRORS = 0x2138, NES_IDX_MAC_RX_OCTETS_LOW = 0x213c, NES_IDX_MAC_RX_OCTETS_HIGH = 0x2140, NES_IDX_MAC_RX_FRAMES_LOW = 0x2144, NES_IDX_MAC_RX_FRAMES_HIGH = 0x2148, NES_IDX_MAC_RX_BC_FRAMES_LOW = 0x214c, NES_IDX_MAC_RX_MC_FRAMES_HIGH = 0x2150, NES_IDX_MAC_RX_PAUSE_FRAMES = 0x2154, NES_IDX_MAC_RX_SHORT_FRAMES = 0x2174, NES_IDX_MAC_RX_OVERSIZED_FRAMES = 0x2178, NES_IDX_MAC_RX_JABBER_FRAMES = 0x217c, NES_IDX_MAC_RX_CRC_ERR_FRAMES = 0x2180, NES_IDX_MAC_RX_LENGTH_ERR_FRAMES = 0x2184, NES_IDX_MAC_RX_SYMBOL_ERR_FRAMES = 0x2188, NES_IDX_MAC_INT_STATUS = 0x21f0, NES_IDX_MAC_INT_MASK = 0x21f4, NES_IDX_PHY_PCS_CONTROL_STATUS0 = 0x2800, NES_IDX_PHY_PCS_CONTROL_STATUS1 = 0x2a00, NES_IDX_ETH_SERDES_COMMON_CONTROL0 = 0x2808, NES_IDX_ETH_SERDES_COMMON_CONTROL1 = 0x2a08, NES_IDX_ETH_SERDES_COMMON_STATUS0 = 0x280c, NES_IDX_ETH_SERDES_COMMON_STATUS1 = 0x2a0c, NES_IDX_ETH_SERDES_TX_EMP0 = 0x2810, NES_IDX_ETH_SERDES_TX_EMP1 = 0x2a10, NES_IDX_ETH_SERDES_TX_DRIVE0 = 0x2814, NES_IDX_ETH_SERDES_TX_DRIVE1 = 0x2a14, NES_IDX_ETH_SERDES_RX_MODE0 = 0x2818, NES_IDX_ETH_SERDES_RX_MODE1 = 0x2a18, NES_IDX_ETH_SERDES_RX_SIGDET0 = 0x281c, NES_IDX_ETH_SERDES_RX_SIGDET1 = 0x2a1c, NES_IDX_ETH_SERDES_BYPASS0 = 0x2820, NES_IDX_ETH_SERDES_BYPASS1 = 0x2a20, NES_IDX_ETH_SERDES_LOOPBACK_CONTROL0 = 0x2824, NES_IDX_ETH_SERDES_LOOPBACK_CONTROL1 = 0x2a24, NES_IDX_ETH_SERDES_RX_EQ_CONTROL0 = 0x2828, NES_IDX_ETH_SERDES_RX_EQ_CONTROL1 = 0x2a28, NES_IDX_ETH_SERDES_RX_EQ_STATUS0 = 0x282c, NES_IDX_ETH_SERDES_RX_EQ_STATUS1 = 0x2a2c, NES_IDX_ETH_SERDES_CDR_RESET0 = 0x2830, NES_IDX_ETH_SERDES_CDR_RESET1 = 0x2a30, NES_IDX_ETH_SERDES_CDR_CONTROL0 = 0x2834, NES_IDX_ETH_SERDES_CDR_CONTROL1 = 0x2a34, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE0 = 0x2838, NES_IDX_ETH_SERDES_TX_HIGHZ_LANE_MODE1 = 0x2a38, NES_IDX_ENDNODE0_NSTAT_RX_DISCARD = 0x3080, NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_LO = 0x3000, NES_IDX_ENDNODE0_NSTAT_RX_OCTETS_HI = 0x3004, NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_LO = 0x3008, NES_IDX_ENDNODE0_NSTAT_RX_FRAMES_HI = 0x300c, NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_LO = 0x7000, NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004, NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008, NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c, NES_IDX_WQM_CONFIG0 = 0x5000, NES_IDX_WQM_CONFIG1 = 0x5004, NES_IDX_CM_CONFIG = 0x5100, NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000, NES_IDX_NIC_PHYPORT_TO_USW = 0x6008, NES_IDX_NIC_ACTIVE = 0x6010, NES_IDX_NIC_UNICAST_ALL = 0x6018, NES_IDX_NIC_MULTICAST_ALL = 0x6020, NES_IDX_NIC_MULTICAST_ENABLE = 0x6028, NES_IDX_NIC_BROADCAST_ON = 0x6030, NES_IDX_USED_CHUNKS_TX = 0x60b0, NES_IDX_TX_POOL_SIZE = 0x60b8, NES_IDX_QUAD_HASH_TABLE_SIZE = 0x6148, NES_IDX_PERFECT_FILTER_LOW = 0x6200, NES_IDX_PERFECT_FILTER_HIGH = 0x6204, NES_IDX_IPV4_TCP_REXMITS = 0x7080, NES_IDX_DEBUG_ERROR_CONTROL_STATUS = 0x913c, NES_IDX_DEBUG_ERROR_MASKS0 = 0x9140, NES_IDX_DEBUG_ERROR_MASKS1 = 0x9144, NES_IDX_DEBUG_ERROR_MASKS2 = 0x9148, NES_IDX_DEBUG_ERROR_MASKS3 = 0x914c, NES_IDX_DEBUG_ERROR_MASKS4 = 0x9150, NES_IDX_DEBUG_ERROR_MASKS5 = 0x9154, }; #define NES_IDX_MAC_TX_CONFIG_ENABLE_PAUSE 1 #define NES_IDX_MPP_DEBUG_PORT_DISABLE_PAUSE (1 << 17) enum nes_cqp_opcodes { NES_CQP_CREATE_QP = 0x00, NES_CQP_MODIFY_QP = 0x01, NES_CQP_DESTROY_QP = 0x02, NES_CQP_CREATE_CQ = 0x03, NES_CQP_MODIFY_CQ = 0x04, NES_CQP_DESTROY_CQ = 0x05, NES_CQP_ALLOCATE_STAG = 0x09, NES_CQP_REGISTER_STAG = 0x0a, NES_CQP_QUERY_STAG = 0x0b, NES_CQP_REGISTER_SHARED_STAG = 0x0c, NES_CQP_DEALLOCATE_STAG = 0x0d, NES_CQP_MANAGE_ARP_CACHE = 0x0f, NES_CQP_DOWNLOAD_SEGMENT = 0x10, NES_CQP_SUSPEND_QPS = 0x11, NES_CQP_UPLOAD_CONTEXT = 0x13, NES_CQP_CREATE_CEQ = 0x16, NES_CQP_DESTROY_CEQ = 0x18, NES_CQP_CREATE_AEQ = 0x19, NES_CQP_DESTROY_AEQ = 0x1b, NES_CQP_LMI_ACCESS = 0x20, NES_CQP_FLUSH_WQES = 0x22, NES_CQP_MANAGE_APBVT = 0x23, NES_CQP_MANAGE_QUAD_HASH = 0x25 }; enum nes_cqp_wqe_word_idx { NES_CQP_WQE_OPCODE_IDX = 0, NES_CQP_WQE_ID_IDX = 1, NES_CQP_WQE_COMP_CTX_LOW_IDX = 2, NES_CQP_WQE_COMP_CTX_HIGH_IDX = 3, NES_CQP_WQE_COMP_SCRATCH_LOW_IDX = 4, NES_CQP_WQE_COMP_SCRATCH_HIGH_IDX = 5, }; enum nes_cqp_wqe_word_download_idx { /* format differs from other cqp ops */ NES_CQP_WQE_DL_OPCODE_IDX = 0, NES_CQP_WQE_DL_COMP_CTX_LOW_IDX = 1, NES_CQP_WQE_DL_COMP_CTX_HIGH_IDX = 2, NES_CQP_WQE_DL_LENGTH_0_TOTAL_IDX = 3 /* For index values 4-15 use NES_NIC_SQ_WQE_ values */ }; enum nes_cqp_cq_wqeword_idx { NES_CQP_CQ_WQE_PBL_LOW_IDX = 6, NES_CQP_CQ_WQE_PBL_HIGH_IDX = 7, NES_CQP_CQ_WQE_CQ_CONTEXT_LOW_IDX = 8, NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX = 9, NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX = 10, }; enum nes_cqp_stag_wqeword_idx { NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX = 1, NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX = 6, NES_CQP_STAG_WQE_LEN_LOW_IDX = 7, NES_CQP_STAG_WQE_STAG_IDX = 8, NES_CQP_STAG_WQE_VA_LOW_IDX = 10, NES_CQP_STAG_WQE_VA_HIGH_IDX = 11, NES_CQP_STAG_WQE_PA_LOW_IDX = 12, NES_CQP_STAG_WQE_PA_HIGH_IDX = 13, NES_CQP_STAG_WQE_PBL_LEN_IDX = 14 }; #define NES_CQP_OP_LOGICAL_PORT_SHIFT 26 #define NES_CQP_OP_IWARP_STATE_SHIFT 28 #define NES_CQP_OP_TERMLEN_SHIFT 28 enum nes_cqp_qp_bits { NES_CQP_QP_ARP_VALID = (1<<8), NES_CQP_QP_WINBUF_VALID = (1<<9), NES_CQP_QP_CONTEXT_VALID = (1<<10), NES_CQP_QP_ORD_VALID = (1<<11), NES_CQP_QP_WINBUF_DATAIND_EN = (1<<12), NES_CQP_QP_VIRT_WQS = (1<<13), NES_CQP_QP_DEL_HTE = (1<<14), NES_CQP_QP_CQS_VALID = (1<<15), NES_CQP_QP_TYPE_TSA = 0, NES_CQP_QP_TYPE_IWARP = (1<<16), NES_CQP_QP_TYPE_CQP = (4<<16), NES_CQP_QP_TYPE_NIC = (5<<16), NES_CQP_QP_MSS_CHG = (1<<20), NES_CQP_QP_STATIC_RESOURCES = (1<<21), NES_CQP_QP_IGNORE_MW_BOUND = (1<<22), NES_CQP_QP_VWQ_USE_LMI = (1<<23), NES_CQP_QP_IWARP_STATE_IDLE = (1<netdev */ u8 perfect_filter_index; u8 nic_index; u8 qp_nic_index[4]; u8 next_qp_nic_index; u8 of_device_registered; u8 rdma_enabled; struct timer_list event_timer; enum ib_event_type delayed_event; enum ib_event_type last_dispatched_event; spinlock_t port_ibevent_lock; u32 mgt_mem_size; void *mgt_vbase; dma_addr_t mgt_pbase; struct nes_vnic_mgt *mgtvnic[NES_MGT_QP_COUNT]; struct task_struct *mgt_thread; wait_queue_head_t mgt_wait_queue; struct sk_buff_head mgt_skb_list; }; struct nes_ib_device { struct ib_device ibdev; struct nes_vnic *nesvnic; /* Virtual RNIC Limits */ u32 max_mr; u32 max_qp; u32 max_cq; u32 max_pd; u32 num_mr; u32 num_qp; u32 num_cq; u32 num_pd; }; enum nes_hdrct_flags { DDP_LEN_FLAG = 0x80, DDP_HDR_FLAG = 0x40, RDMA_HDR_FLAG = 0x20 }; enum nes_term_layers { LAYER_RDMA = 0, LAYER_DDP = 1, LAYER_MPA = 2 }; enum nes_term_error_types { RDMAP_CATASTROPHIC = 0, RDMAP_REMOTE_PROT = 1, RDMAP_REMOTE_OP = 2, DDP_CATASTROPHIC = 0, DDP_TAGGED_BUFFER = 1, DDP_UNTAGGED_BUFFER = 2, DDP_LLP = 3 }; enum nes_term_rdma_errors { RDMAP_INV_STAG = 0x00, RDMAP_INV_BOUNDS = 0x01, RDMAP_ACCESS = 0x02, RDMAP_UNASSOC_STAG = 0x03, RDMAP_TO_WRAP = 0x04, RDMAP_INV_RDMAP_VER = 0x05, RDMAP_UNEXPECTED_OP = 0x06, RDMAP_CATASTROPHIC_LOCAL = 0x07, RDMAP_CATASTROPHIC_GLOBAL = 0x08, RDMAP_CANT_INV_STAG = 0x09, RDMAP_UNSPECIFIED = 0xff }; enum nes_term_ddp_errors { DDP_CATASTROPHIC_LOCAL = 0x00, DDP_TAGGED_INV_STAG = 0x00, DDP_TAGGED_BOUNDS = 0x01, DDP_TAGGED_UNASSOC_STAG = 0x02, DDP_TAGGED_TO_WRAP = 0x03, DDP_TAGGED_INV_DDP_VER = 0x04, DDP_UNTAGGED_INV_QN = 0x01, DDP_UNTAGGED_INV_MSN_NO_BUF = 0x02, DDP_UNTAGGED_INV_MSN_RANGE = 0x03, DDP_UNTAGGED_INV_MO = 0x04, DDP_UNTAGGED_INV_TOO_LONG = 0x05, DDP_UNTAGGED_INV_DDP_VER = 0x06 }; enum nes_term_mpa_errors { MPA_CLOSED = 0x01, MPA_CRC = 0x02, MPA_MARKER = 0x03, MPA_REQ_RSP = 0x04, }; struct nes_terminate_hdr { u8 layer_etype; u8 error_code; u8 hdrct; u8 rsvd; }; /* Used to determine how to fill in terminate error codes */ #define IWARP_OPCODE_WRITE 0 #define IWARP_OPCODE_READREQ 1 #define IWARP_OPCODE_READRSP 2 #define IWARP_OPCODE_SEND 3 #define IWARP_OPCODE_SEND_INV 4 #define IWARP_OPCODE_SEND_SE 5 #define IWARP_OPCODE_SEND_SE_INV 6 #define IWARP_OPCODE_TERM 7 /* These values are used only during terminate processing */ #define TERM_DDP_LEN_TAGGED 14 #define TERM_DDP_LEN_UNTAGGED 18 #define TERM_RDMA_LEN 28 #define RDMA_OPCODE_MASK 0x0f #define RDMA_READ_REQ_OPCODE 1 #define BAD_FRAME_OFFSET 64 #define CQE_MAJOR_DRV 0x8000 /* Used for link status recheck after interrupt processing */ #define NES_LINK_RECHECK_DELAY msecs_to_jiffies(50) #define NES_LINK_RECHECK_MAX 60 #endif /* __NES_HW_H */