1*14b24e2bSVaishali Kulkarni /* 2*14b24e2bSVaishali Kulkarni * CDDL HEADER START 3*14b24e2bSVaishali Kulkarni * 4*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the 5*14b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1, (the "License"). 6*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License. 7*14b24e2bSVaishali Kulkarni * 8*14b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*14b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0. 10*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions 11*14b24e2bSVaishali Kulkarni * and limitations under the License. 12*14b24e2bSVaishali Kulkarni * 13*14b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each 14*14b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*14b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the 16*14b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying 17*14b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner] 18*14b24e2bSVaishali Kulkarni * 19*14b24e2bSVaishali Kulkarni * CDDL HEADER END 20*14b24e2bSVaishali Kulkarni */ 21*14b24e2bSVaishali Kulkarni 22*14b24e2bSVaishali Kulkarni /* 23*14b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc. 24*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development 25*14b24e2bSVaishali Kulkarni * and Distribution License, v.1, (the "License"). 26*14b24e2bSVaishali Kulkarni 27*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License. 28*14b24e2bSVaishali Kulkarni 29*14b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available 30*14b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0 31*14b24e2bSVaishali Kulkarni 32*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and 33*14b24e2bSVaishali Kulkarni * limitations under the License. 34*14b24e2bSVaishali Kulkarni */ 35*14b24e2bSVaishali Kulkarni 36*14b24e2bSVaishali Kulkarni #ifndef _QEDE_H 37*14b24e2bSVaishali Kulkarni #define _QEDE_H 38*14b24e2bSVaishali Kulkarni 39*14b24e2bSVaishali Kulkarni #include <sys/stream.h> 40*14b24e2bSVaishali Kulkarni 41*14b24e2bSVaishali Kulkarni #include <sys/ddi.h> 42*14b24e2bSVaishali Kulkarni #include <sys/ddifm.h> 43*14b24e2bSVaishali Kulkarni #include <sys/dditypes.h> 44*14b24e2bSVaishali Kulkarni #include <sys/sunddi.h> 45*14b24e2bSVaishali Kulkarni #include <sys/fm/io/ddi.h> 46*14b24e2bSVaishali Kulkarni #include <sys/mac_provider.h> 47*14b24e2bSVaishali Kulkarni #include <sys/mac_ether.h> 48*14b24e2bSVaishali Kulkarni #include <sys/kobj.h> 49*14b24e2bSVaishali Kulkarni #include <sys/mac.h> 50*14b24e2bSVaishali Kulkarni #include <sys/dlpi.h> 51*14b24e2bSVaishali Kulkarni #include <sys/pattr.h> 52*14b24e2bSVaishali Kulkarni #include <sys/gld.h> 53*14b24e2bSVaishali Kulkarni #include <inet/ip.h> 54*14b24e2bSVaishali Kulkarni #include <inet/tcp.h> 55*14b24e2bSVaishali Kulkarni #include <netinet/udp.h> 56*14b24e2bSVaishali Kulkarni #include <sys/ethernet.h> 57*14b24e2bSVaishali Kulkarni #include <sys/pci.h> 58*14b24e2bSVaishali Kulkarni #include <sys/netlb.h> 59*14b24e2bSVaishali Kulkarni #include <sys/strsun.h> 60*14b24e2bSVaishali Kulkarni #include <sys/strsubr.h> 61*14b24e2bSVaishali Kulkarni #include <sys/policy.h> 62*14b24e2bSVaishali Kulkarni 63*14b24e2bSVaishali Kulkarni #include "qede_version.h" 64*14b24e2bSVaishali Kulkarni #include "bcm_osal.h" 65*14b24e2bSVaishali Kulkarni #include "qede_fp.h" 66*14b24e2bSVaishali Kulkarni 67*14b24e2bSVaishali Kulkarni #if 1 68*14b24e2bSVaishali Kulkarni #include "ecore.h" 69*14b24e2bSVaishali Kulkarni #include "ecore_status.h" 70*14b24e2bSVaishali Kulkarni #include "ecore_utils.h" 71*14b24e2bSVaishali Kulkarni #include "ecore_chain.h" 72*14b24e2bSVaishali Kulkarni #include "ecore_hsi_common.h" 73*14b24e2bSVaishali Kulkarni #include "ecore_hsi_eth.h" 74*14b24e2bSVaishali Kulkarni #include "ecore_proto_if.h" 75*14b24e2bSVaishali Kulkarni #include "ecore_iov_api.h" 76*14b24e2bSVaishali Kulkarni #include "ecore_int_api.h" 77*14b24e2bSVaishali Kulkarni #include "ecore_dev_api.h" 78*14b24e2bSVaishali Kulkarni #include "ecore_l2_api.h" 79*14b24e2bSVaishali Kulkarni #include "ecore_hw.h" 80*14b24e2bSVaishali Kulkarni #include "nvm_cfg.h" 81*14b24e2bSVaishali Kulkarni #include "ecore_mcp.h" 82*14b24e2bSVaishali Kulkarni #include "ecore_dbg_fw_funcs.h" 83*14b24e2bSVaishali Kulkarni #include <sys/pcie.h> 84*14b24e2bSVaishali Kulkarni #include <sys/time.h> 85*14b24e2bSVaishali Kulkarni #else 86*14b24e2bSVaishali Kulkarni #include <ecore.h> 87*14b24e2bSVaishali Kulkarni #include <ecore_status.h> 88*14b24e2bSVaishali Kulkarni #include <ecore_utils.h> 89*14b24e2bSVaishali Kulkarni #include <ecore_hsi_common.h> 90*14b24e2bSVaishali Kulkarni #include <ecore_hsi_eth.h> 91*14b24e2bSVaishali Kulkarni #include <ecore_proto_if.h> 92*14b24e2bSVaishali Kulkarni #include <ecore_chain.h> 93*14b24e2bSVaishali Kulkarni #include <ecore_iov_api.h> 94*14b24e2bSVaishali Kulkarni #include <ecore_int_api.h> 95*14b24e2bSVaishali Kulkarni #include <ecore_dev_api.h> 96*14b24e2bSVaishali Kulkarni #include <ecore_ll2_api.h> 97*14b24e2bSVaishali Kulkarni #include <ecore_l2_api.h> 98*14b24e2bSVaishali Kulkarni #include <ecore_mcp.h> 99*14b24e2bSVaishali Kulkarni #endif 100*14b24e2bSVaishali Kulkarni 101*14b24e2bSVaishali Kulkarni 102*14b24e2bSVaishali Kulkarni 103*14b24e2bSVaishali Kulkarni #ifndef STRINGIFY 104*14b24e2bSVaishali Kulkarni #define XSTRINGIFY(x) #x 105*14b24e2bSVaishali Kulkarni #define STRINGIFY(x) XSTRINGIFY(x) 106*14b24e2bSVaishali Kulkarni #endif 107*14b24e2bSVaishali Kulkarni #define QEDE_STR_SIZE 32 108*14b24e2bSVaishali Kulkarni /* Product Identification Banner */ 109*14b24e2bSVaishali Kulkarni #define QEDE_PRODUCT_INFO\ 110*14b24e2bSVaishali Kulkarni "QLogic FastLinQ QL45xxx " STRINGIFY(MAJVERSION) \ 111*14b24e2bSVaishali Kulkarni "." STRINGIFY(MINVERSION) "." STRINGIFY(REVVERSION) 112*14b24e2bSVaishali Kulkarni 113*14b24e2bSVaishali Kulkarni /* 114*14b24e2bSVaishali Kulkarni * Debug Infrastructure 115*14b24e2bSVaishali Kulkarni */ 116*14b24e2bSVaishali Kulkarni #define DEBUG_NONE 0x0 117*14b24e2bSVaishali Kulkarni #define DEBUG_ATTACH 0x1 118*14b24e2bSVaishali Kulkarni 119*14b24e2bSVaishali Kulkarni #ifndef DEBUG_LEVEL 120*14b24e2bSVaishali Kulkarni #define DEBUG_LEVEL DEBUG_NONE 121*14b24e2bSVaishali Kulkarni #endif 122*14b24e2bSVaishali Kulkarni 123*14b24e2bSVaishali Kulkarni #define qede_dbg(MASK, ptr, fmt, ...) \ 124*14b24e2bSVaishali Kulkarni do { \ 125*14b24e2bSVaishali Kulkarni if (DEBUG_LEVEL & (MASK)) { \ 126*14b24e2bSVaishali Kulkarni qede_print("!%s(%d) STRINGIFY(MASK):" fmt, __func__, \ 127*14b24e2bSVaishali Kulkarni (ptr)->instance, \ 128*14b24e2bSVaishali Kulkarni ##__VA_ARGS__);\ 129*14b24e2bSVaishali Kulkarni } \ 130*14b24e2bSVaishali Kulkarni } while (0); 131*14b24e2bSVaishali Kulkarni 132*14b24e2bSVaishali Kulkarni #define qede_info(ptr, fmt, ...) \ 133*14b24e2bSVaishali Kulkarni do { \ 134*14b24e2bSVaishali Kulkarni qede_print("!%s(%d):" fmt, __func__, (ptr)->instance, \ 135*14b24e2bSVaishali Kulkarni ##__VA_ARGS__); \ 136*14b24e2bSVaishali Kulkarni } while (0); 137*14b24e2bSVaishali Kulkarni 138*14b24e2bSVaishali Kulkarni #define qede_warn(ptr, fmt, ...) \ 139*14b24e2bSVaishali Kulkarni do { \ 140*14b24e2bSVaishali Kulkarni qede_print_err("!%s(%d):" fmt, __func__, (ptr)->instance, \ 141*14b24e2bSVaishali Kulkarni ##__VA_ARGS__); \ 142*14b24e2bSVaishali Kulkarni } while (0); 143*14b24e2bSVaishali Kulkarni 144*14b24e2bSVaishali Kulkarni #ifdef __sparc 145*14b24e2bSVaishali Kulkarni #define QEDE_PAGE_ALIGNMENT 0x0000000000002000ull 146*14b24e2bSVaishali Kulkarni #define QEDE_PAGE_SIZE 0x0000000000002000ull 147*14b24e2bSVaishali Kulkarni #else 148*14b24e2bSVaishali Kulkarni #define QEDE_PAGE_ALIGNMENT 0x0000000000001000ull 149*14b24e2bSVaishali Kulkarni #define QEDE_PAGE_SIZE 0x0000000000001000ull 150*14b24e2bSVaishali Kulkarni #endif 151*14b24e2bSVaishali Kulkarni 152*14b24e2bSVaishali Kulkarni #define LE_TO_HOST_64 LE_64 153*14b24e2bSVaishali Kulkarni #define HOST_TO_LE_64 LE_64 154*14b24e2bSVaishali Kulkarni #define HOST_TO_LE_32 LE_32 155*14b24e2bSVaishali Kulkarni #define LE_TO_HOST_32 LE_32 156*14b24e2bSVaishali Kulkarni #define HOST_TO_LE_16 LE_16 157*14b24e2bSVaishali Kulkarni #define LE_TO_HOST_16 LE_16 158*14b24e2bSVaishali Kulkarni 159*14b24e2bSVaishali Kulkarni 160*14b24e2bSVaishali Kulkarni 161*14b24e2bSVaishali Kulkarni #define QEDE_LSO_MAXLEN 65535 162*14b24e2bSVaishali Kulkarni 163*14b24e2bSVaishali Kulkarni #define BUF_2K_SIZE 2048 164*14b24e2bSVaishali Kulkarni #define BUF_2K_ALIGNMENT BUF_2K_SIZE 165*14b24e2bSVaishali Kulkarni 166*14b24e2bSVaishali Kulkarni #define MIN_TX_RING_COUNT 1 167*14b24e2bSVaishali Kulkarni #define MAX_TX_RING_COUNT 1 168*14b24e2bSVaishali Kulkarni #define DEFAULT_TX_RING_COUNT 1 169*14b24e2bSVaishali Kulkarni #define MAX_TC_COUNT 1 170*14b24e2bSVaishali Kulkarni #define DEFAULT_TRFK_CLASS_COUNT 1 171*14b24e2bSVaishali Kulkarni 172*14b24e2bSVaishali Kulkarni #define MIN_TX_RING_SIZE 1024 173*14b24e2bSVaishali Kulkarni #define DEFAULT_TX_RING_SIZE 8192 174*14b24e2bSVaishali Kulkarni 175*14b24e2bSVaishali Kulkarni #define DEFAULT_TX_COPY_THRESHOLD 256 176*14b24e2bSVaishali Kulkarni #define DEFAULT_TX_RECYCLE_THRESHOLD 128 177*14b24e2bSVaishali Kulkarni 178*14b24e2bSVaishali Kulkarni #define TX_RING_MASK (tx_ring->tx_ring_size - 1) 179*14b24e2bSVaishali Kulkarni 180*14b24e2bSVaishali Kulkarni #define IP_ALIGNMENT_BYTES 2 181*14b24e2bSVaishali Kulkarni #define QEDE_MAX_ETHER_HDR 18 182*14b24e2bSVaishali Kulkarni 183*14b24e2bSVaishali Kulkarni #define MIN_FASTPATH_COUNT 1 184*14b24e2bSVaishali Kulkarni #define MAX_FASTPATH_COUNT 6 185*14b24e2bSVaishali Kulkarni #define DEFAULT_FASTPATH_COUNT 4 186*14b24e2bSVaishali Kulkarni 187*14b24e2bSVaishali Kulkarni #define MIN_RX_RING_SIZE 1024 188*14b24e2bSVaishali Kulkarni #define DEFAULT_RX_RING_SIZE 8192 189*14b24e2bSVaishali Kulkarni #define MAX_RX_RING_SIZE DEFAULT_RX_RING_SIZE 190*14b24e2bSVaishali Kulkarni 191*14b24e2bSVaishali Kulkarni #define MIN_RX_BUF_SIZE 2048 192*14b24e2bSVaishali Kulkarni #define MAX_RX_BUF_SIZE 2048 193*14b24e2bSVaishali Kulkarni #define DEFAULT_RX_BUF_SIZE 2048 194*14b24e2bSVaishali Kulkarni 195*14b24e2bSVaishali Kulkarni #define DEFAULT_RX_COPY_THRESHOLD 128 196*14b24e2bSVaishali Kulkarni #define RX_RING_MASK (rx_ring->rx_buf_count - 1) 197*14b24e2bSVaishali Kulkarni #define MIN_RX_BUF_COUNT MIN_RX_RING_SIZE 198*14b24e2bSVaishali Kulkarni #define MAX_RX_BUF_COUNT MAX_RX_RING_SIZE 199*14b24e2bSVaishali Kulkarni #define DEFAULT_RX_BUF_COUNT DEFAULT_RX_RING_SIZE 200*14b24e2bSVaishali Kulkarni #define RX_LOW_BUFFER_THRESHOLD 128 201*14b24e2bSVaishali Kulkarni 202*14b24e2bSVaishali Kulkarni #define USER_OPTION_CKSUM_NONE 0x0 203*14b24e2bSVaishali Kulkarni #define USER_OPTION_CKSUM_L3 0x1 204*14b24e2bSVaishali Kulkarni #define USER_OPTION_CKSUM_L3_L4 0x2 205*14b24e2bSVaishali Kulkarni #define DEFAULT_CKSUM_OFFLOAD USER_OPTION_CKSUM_L3_L4 206*14b24e2bSVaishali Kulkarni 207*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_NONE 0x00000000 208*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_TX_IP_CKSUM 0x00000001 209*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_RX_IP_CKSUM 0x00000002 210*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_TX_TCP_CKSUM 0x00000004 211*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_RX_TCP_CKSUM 0x00000008 212*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_TX_UDP_CKSUM 0x00000010 213*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_RX_UDP_CKSUM 0x00000020 214*14b24e2bSVaishali Kulkarni 215*14b24e2bSVaishali Kulkarni #define DEFAULT_JUMBO_MTU 9000 216*14b24e2bSVaishali Kulkarni #define MIN_MTU ETHERMTU 217*14b24e2bSVaishali Kulkarni #define MAX_MTU DEFAULT_JUMBO_MTU 218*14b24e2bSVaishali Kulkarni #define DEFAULT_MTU ETHERMTU 219*14b24e2bSVaishali Kulkarni 220*14b24e2bSVaishali Kulkarni #define DEFAULT_ECORE_DEBUG_LEVEL ECORE_LEVEL_VERBOSE 221*14b24e2bSVaishali Kulkarni 222*14b24e2bSVaishali Kulkarni 223*14b24e2bSVaishali Kulkarni #define DEFAULT_ECORE_DEBUG_MODULE ECORE_MSG_DRV 224*14b24e2bSVaishali Kulkarni 225*14b24e2bSVaishali Kulkarni #define VLAN_TAGSZ 0x4 226*14b24e2bSVaishali Kulkarni 227*14b24e2bSVaishali Kulkarni #define MAX_TC 1 228*14b24e2bSVaishali Kulkarni 229*14b24e2bSVaishali Kulkarni #define DUPLEX_HALF 0 230*14b24e2bSVaishali Kulkarni #define DUPLEX_FULL 1 231*14b24e2bSVaishali Kulkarni 232*14b24e2bSVaishali Kulkarni #define ETH_ALLEN 6 233*14b24e2bSVaishali Kulkarni 234*14b24e2bSVaishali Kulkarni #define MAC_STRING "%2x:%2x:%2x:%2x:%2x:%2x" 235*14b24e2bSVaishali Kulkarni #define MACTOSTR(a) a[0], a[1], a[2], a[3], a[4], a[5] 236*14b24e2bSVaishali Kulkarni 237*14b24e2bSVaishali Kulkarni #define MAX_MC_SOFT_LIMIT 1024 238*14b24e2bSVaishali Kulkarni 239*14b24e2bSVaishali Kulkarni #define qede_delay(_msecs_) delay(drv_usectohz(_msecs_ * 1000)) 240*14b24e2bSVaishali Kulkarni 241*14b24e2bSVaishali Kulkarni #define QEDE_CMD 73 242*14b24e2bSVaishali Kulkarni 243*14b24e2bSVaishali Kulkarni 244*14b24e2bSVaishali Kulkarni typedef struct _KstatRingMap 245*14b24e2bSVaishali Kulkarni { 246*14b24e2bSVaishali Kulkarni uint32_t idx; /* ring index */ 247*14b24e2bSVaishali Kulkarni void * qede; /* reference back to qede_t */ 248*14b24e2bSVaishali Kulkarni } KstatRingMap; 249*14b24e2bSVaishali Kulkarni 250*14b24e2bSVaishali Kulkarni #define IS_ETH_MULTICAST(eth_addr) \ 251*14b24e2bSVaishali Kulkarni (((unsigned char *) (eth_addr))[0] & ((unsigned char) 0x01)) 252*14b24e2bSVaishali Kulkarni 253*14b24e2bSVaishali Kulkarni #define IS_ETH_ADDRESS_EQUAL(eth_addr1, eth_addr2) \ 254*14b24e2bSVaishali Kulkarni ((((unsigned char *) (eth_addr1))[0] == \ 255*14b24e2bSVaishali Kulkarni ((unsigned char *) (eth_addr2))[0]) && \ 256*14b24e2bSVaishali Kulkarni (((unsigned char *) (eth_addr1))[1] == \ 257*14b24e2bSVaishali Kulkarni ((unsigned char *) (eth_addr2))[1]) && \ 258*14b24e2bSVaishali Kulkarni (((unsigned char *) (eth_addr1))[2] == \ 259*14b24e2bSVaishali Kulkarni ((unsigned char *) (eth_addr2))[2]) && \ 260*14b24e2bSVaishali Kulkarni (((unsigned char *) (eth_addr1))[3] == \ 261*14b24e2bSVaishali Kulkarni ((unsigned char *) (eth_addr2))[3]) && \ 262*14b24e2bSVaishali Kulkarni (((unsigned char *) (eth_addr1))[4] == \ 263*14b24e2bSVaishali Kulkarni ((unsigned char *) (eth_addr2))[4]) && \ 264*14b24e2bSVaishali Kulkarni (((unsigned char *) (eth_addr1))[5] == \ 265*14b24e2bSVaishali Kulkarni ((unsigned char *) (eth_addr2))[5])) 266*14b24e2bSVaishali Kulkarni 267*14b24e2bSVaishali Kulkarni #define COPY_ETH_ADDRESS(src, dst) \ 268*14b24e2bSVaishali Kulkarni ((unsigned char *) (dst))[0] = ((unsigned char *) (src))[0]; \ 269*14b24e2bSVaishali Kulkarni ((unsigned char *) (dst))[1] = ((unsigned char *) (src))[1]; \ 270*14b24e2bSVaishali Kulkarni ((unsigned char *) (dst))[2] = ((unsigned char *) (src))[2]; \ 271*14b24e2bSVaishali Kulkarni ((unsigned char *) (dst))[3] = ((unsigned char *) (src))[3]; \ 272*14b24e2bSVaishali Kulkarni ((unsigned char *) (dst))[4] = ((unsigned char *) (src))[4]; \ 273*14b24e2bSVaishali Kulkarni ((unsigned char *) (dst))[5] = ((unsigned char *) (src))[5]; 274*14b24e2bSVaishali Kulkarni 275*14b24e2bSVaishali Kulkarni 276*14b24e2bSVaishali Kulkarni union db_prod { 277*14b24e2bSVaishali Kulkarni struct eth_db_data data; 278*14b24e2bSVaishali Kulkarni uint32_t raw; 279*14b24e2bSVaishali Kulkarni }; 280*14b24e2bSVaishali Kulkarni 281*14b24e2bSVaishali Kulkarni struct qede; 282*14b24e2bSVaishali Kulkarni struct qede_fastpath; 283*14b24e2bSVaishali Kulkarni struct qede_rx_ring; 284*14b24e2bSVaishali Kulkarni struct qede_tx_pktinfo_s; 285*14b24e2bSVaishali Kulkarni 286*14b24e2bSVaishali Kulkarni typedef struct qede_tx_ring { 287*14b24e2bSVaishali Kulkarni struct qede_fastpath *fp; 288*14b24e2bSVaishali Kulkarni struct qede *qede; 289*14b24e2bSVaishali Kulkarni uint32_t tx_queue_index; 290*14b24e2bSVaishali Kulkarni uint16_t *hw_cons_ptr; 291*14b24e2bSVaishali Kulkarni 292*14b24e2bSVaishali Kulkarni /* pointer to driver ring control */ 293*14b24e2bSVaishali Kulkarni struct ecore_chain tx_bd_ring; 294*14b24e2bSVaishali Kulkarni u16 sw_tx_cons; 295*14b24e2bSVaishali Kulkarni u16 sw_tx_prod; 296*14b24e2bSVaishali Kulkarni u16 bd_ring_size; 297*14b24e2bSVaishali Kulkarni 298*14b24e2bSVaishali Kulkarni /* From ecore_sp_tx_queue_start() */ 299*14b24e2bSVaishali Kulkarni void __iomem *doorbell_addr; 300*14b24e2bSVaishali Kulkarni ddi_acc_handle_t doorbell_handle; 301*14b24e2bSVaishali Kulkarni 302*14b24e2bSVaishali Kulkarni /* Saved copy of doorbell data for this tx queue */ 303*14b24e2bSVaishali Kulkarni union db_prod tx_db; 304*14b24e2bSVaishali Kulkarni 305*14b24e2bSVaishali Kulkarni uint32_t fp_idx; 306*14b24e2bSVaishali Kulkarni kmutex_t tx_lock; 307*14b24e2bSVaishali Kulkarni int tx_buf_size; 308*14b24e2bSVaishali Kulkarni uint32_t tx_ring_size; 309*14b24e2bSVaishali Kulkarni bool queue_started; 310*14b24e2bSVaishali Kulkarni mac_ring_handle_t mac_ring_handle; 311*14b24e2bSVaishali Kulkarni 312*14b24e2bSVaishali Kulkarni /* pre-allocated bcopy packets */ 313*14b24e2bSVaishali Kulkarni qede_tx_bcopy_list_t bcopy_list; 314*14b24e2bSVaishali Kulkarni /* pre-allocated dma handles */ 315*14b24e2bSVaishali Kulkarni qede_dma_handles_list_t dmah_list; 316*14b24e2bSVaishali Kulkarni /* List of recycle entires for tx packets */ 317*14b24e2bSVaishali Kulkarni qede_tx_recycle_list_t *tx_recycle_list; 318*14b24e2bSVaishali Kulkarni 319*14b24e2bSVaishali Kulkarni #ifdef DBLK_DMA_PREMAP 320*14b24e2bSVaishali Kulkarni pm_handle_t pm_handle; 321*14b24e2bSVaishali Kulkarni #endif 322*14b24e2bSVaishali Kulkarni /* dma_handle for tx bd ring */ 323*14b24e2bSVaishali Kulkarni ddi_dma_handle_t tx_bd_dmah; 324*14b24e2bSVaishali Kulkarni ddi_dma_handle_t tx_pbl_dmah; 325*14b24e2bSVaishali Kulkarni 326*14b24e2bSVaishali Kulkarni bool tx_q_sleeping; 327*14b24e2bSVaishali Kulkarni 328*14b24e2bSVaishali Kulkarni uint64_t tx_pkt_count; 329*14b24e2bSVaishali Kulkarni uint64_t tx_byte_count; 330*14b24e2bSVaishali Kulkarni uint64_t tx_pkt_dropped; 331*14b24e2bSVaishali Kulkarni uint64_t tx_copy_count; 332*14b24e2bSVaishali Kulkarni uint64_t tx_bind_count; 333*14b24e2bSVaishali Kulkarni uint64_t tx_bind_fail; 334*14b24e2bSVaishali Kulkarni uint64_t tx_premap_count; 335*14b24e2bSVaishali Kulkarni uint64_t tx_premap_fail; 336*14b24e2bSVaishali Kulkarni uint64_t tx_pullup_count; 337*14b24e2bSVaishali Kulkarni uint64_t tx_too_many_cookies; 338*14b24e2bSVaishali Kulkarni uint64_t tx_lso_pkt_count; 339*14b24e2bSVaishali Kulkarni uint64_t tx_ring_pause; 340*14b24e2bSVaishali Kulkarni uint64_t tx_too_many_mblks; 341*14b24e2bSVaishali Kulkarni uint64_t tx_mapped_pkts; 342*14b24e2bSVaishali Kulkarni uint64_t tx_jumbo_pkt_count; 343*14b24e2bSVaishali Kulkarni struct ecore_queue_cid *p_cid; 344*14b24e2bSVaishali Kulkarni } qede_tx_ring_t; 345*14b24e2bSVaishali Kulkarni 346*14b24e2bSVaishali Kulkarni 347*14b24e2bSVaishali Kulkarni typedef struct qede_vector_info { 348*14b24e2bSVaishali Kulkarni /* 349*14b24e2bSVaishali Kulkarni * Pointer to a fastpath structure, 350*14b24e2bSVaishali Kulkarni * or to a hwfnc. 351*14b24e2bSVaishali Kulkarni */ 352*14b24e2bSVaishali Kulkarni void *fp; 353*14b24e2bSVaishali Kulkarni struct qede *qede; 354*14b24e2bSVaishali Kulkarni uint32_t vect_index; 355*14b24e2bSVaishali Kulkarni bool handler_added; 356*14b24e2bSVaishali Kulkarni /* set and cleared by ISR, checked by stop path 357*14b24e2bSVaishali Kulkarni * when waiting for quiesce 358*14b24e2bSVaishali Kulkarni */ 359*14b24e2bSVaishali Kulkarni bool in_isr; 360*14b24e2bSVaishali Kulkarni } qede_vector_info_t; 361*14b24e2bSVaishali Kulkarni 362*14b24e2bSVaishali Kulkarni 363*14b24e2bSVaishali Kulkarni typedef struct qede_fastpath { 364*14b24e2bSVaishali Kulkarni qede_vector_info_t *vect_info; 365*14b24e2bSVaishali Kulkarni 366*14b24e2bSVaishali Kulkarni /* Status block associated with this fp */ 367*14b24e2bSVaishali Kulkarni ddi_dma_handle_t sb_dma_handle; 368*14b24e2bSVaishali Kulkarni ddi_acc_handle_t sb_acc_handle; 369*14b24e2bSVaishali Kulkarni struct status_block *sb_virt; 370*14b24e2bSVaishali Kulkarni uint64_t sb_phys; 371*14b24e2bSVaishali Kulkarni 372*14b24e2bSVaishali Kulkarni struct ecore_sb_info *sb_info; 373*14b24e2bSVaishali Kulkarni struct qede_rx_ring *rx_ring; 374*14b24e2bSVaishali Kulkarni qede_tx_ring_t *tx_ring[MAX_TC]; 375*14b24e2bSVaishali Kulkarni struct qede *qede; 376*14b24e2bSVaishali Kulkarni 377*14b24e2bSVaishali Kulkarni uint32_t fp_index; 378*14b24e2bSVaishali Kulkarni uint32_t fp_hw_eng_index; 379*14b24e2bSVaishali Kulkarni uint32_t vport_id; /* */ 380*14b24e2bSVaishali Kulkarni uint32_t stats_id; /* vport id to hold stats */ 381*14b24e2bSVaishali Kulkarni uint32_t rx_queue_index; 382*14b24e2bSVaishali Kulkarni uint32_t rss_id; 383*14b24e2bSVaishali Kulkarni kmutex_t fp_lock; 384*14b24e2bSVaishali Kulkarni uint32_t disabled_by_poll; 385*14b24e2bSVaishali Kulkarni } qede_fastpath_t; 386*14b24e2bSVaishali Kulkarni 387*14b24e2bSVaishali Kulkarni enum qede_agg_state { 388*14b24e2bSVaishali Kulkarni QEDE_AGG_STATE_NONE = 0, 389*14b24e2bSVaishali Kulkarni QEDE_AGG_STATE_START = 1, 390*14b24e2bSVaishali Kulkarni QEDE_AGG_STATE_ERROR = 2 391*14b24e2bSVaishali Kulkarni }; 392*14b24e2bSVaishali Kulkarni 393*14b24e2bSVaishali Kulkarni #define QEDE_MAX_BD_PER_AGG 16 394*14b24e2bSVaishali Kulkarni struct qede_rx_buffer_s; 395*14b24e2bSVaishali Kulkarni typedef struct qede_lro_info { 396*14b24e2bSVaishali Kulkarni uint16_t pars_flags; 397*14b24e2bSVaishali Kulkarni uint16_t pad; 398*14b24e2bSVaishali Kulkarni uint16_t vlan_tag; 399*14b24e2bSVaishali Kulkarni uint16_t bd_count; 400*14b24e2bSVaishali Kulkarni uint32_t rss_hash; 401*14b24e2bSVaishali Kulkarni uint32_t header_len; 402*14b24e2bSVaishali Kulkarni uint32_t free_buffer_count; 403*14b24e2bSVaishali Kulkarni struct qede_rx_buffer_s *rx_buffer[QEDE_MAX_BD_PER_AGG]; 404*14b24e2bSVaishali Kulkarni enum qede_agg_state agg_state; 405*14b24e2bSVaishali Kulkarni } qede_lro_info_t; 406*14b24e2bSVaishali Kulkarni 407*14b24e2bSVaishali Kulkarni typedef struct qede_dma_info_s { 408*14b24e2bSVaishali Kulkarni ddi_acc_handle_t acc_handle; 409*14b24e2bSVaishali Kulkarni ddi_dma_handle_t dma_handle; 410*14b24e2bSVaishali Kulkarni u32 ncookies; 411*14b24e2bSVaishali Kulkarni u32 offset; 412*14b24e2bSVaishali Kulkarni u64 phys_addr; 413*14b24e2bSVaishali Kulkarni void *virt_addr; 414*14b24e2bSVaishali Kulkarni u32 pad; 415*14b24e2bSVaishali Kulkarni } qede_dma_info_t; 416*14b24e2bSVaishali Kulkarni 417*14b24e2bSVaishali Kulkarni enum rx_buf_state { 418*14b24e2bSVaishali Kulkarni RX_BUF_STATE_FREE, 419*14b24e2bSVaishali Kulkarni RX_BUF_STATE_WITH_FW, 420*14b24e2bSVaishali Kulkarni RX_BUF_STATE_WITH_OS, 421*14b24e2bSVaishali Kulkarni RX_BUF_STATE_WITH_DRV, 422*14b24e2bSVaishali Kulkarni }; 423*14b24e2bSVaishali Kulkarni 424*14b24e2bSVaishali Kulkarni struct qede_rx_buf_area; 425*14b24e2bSVaishali Kulkarni 426*14b24e2bSVaishali Kulkarni typedef struct qede_rx_buffer_s { 427*14b24e2bSVaishali Kulkarni qede_dma_info_t dma_info; 428*14b24e2bSVaishali Kulkarni mblk_t *mp; 429*14b24e2bSVaishali Kulkarni u32 index; 430*14b24e2bSVaishali Kulkarni struct qede_rx_ring *rx_ring; 431*14b24e2bSVaishali Kulkarni 432*14b24e2bSVaishali Kulkarni /* Recycle function */ 433*14b24e2bSVaishali Kulkarni frtn_t recycle; 434*14b24e2bSVaishali Kulkarni u32 ref_cnt; 435*14b24e2bSVaishali Kulkarni enum rx_buf_state buf_state; 436*14b24e2bSVaishali Kulkarni struct qede_rx_buf_area *rx_buf_area; 437*14b24e2bSVaishali Kulkarni } qede_rx_buffer_t; 438*14b24e2bSVaishali Kulkarni 439*14b24e2bSVaishali Kulkarni typedef struct qede_rx_buf_list_s { 440*14b24e2bSVaishali Kulkarni kmutex_t lock; 441*14b24e2bSVaishali Kulkarni u16 head, tail; 442*14b24e2bSVaishali Kulkarni u32 num_entries; 443*14b24e2bSVaishali Kulkarni qede_rx_buffer_t *buf_list[DEFAULT_RX_RING_SIZE]; 444*14b24e2bSVaishali Kulkarni } qede_rx_buf_list_t; 445*14b24e2bSVaishali Kulkarni 446*14b24e2bSVaishali Kulkarni typedef struct qede_rx_buf_area { 447*14b24e2bSVaishali Kulkarni //kmutex_t rx_buf_area_lock; 448*14b24e2bSVaishali Kulkarni qede_rx_buffer_t rx_buf_pool[DEFAULT_RX_RING_SIZE]; 449*14b24e2bSVaishali Kulkarni 450*14b24e2bSVaishali Kulkarni qede_rx_buf_list_t active_buf_list; 451*14b24e2bSVaishali Kulkarni qede_rx_buf_list_t passive_buf_list; 452*14b24e2bSVaishali Kulkarni 453*14b24e2bSVaishali Kulkarni u32 bufs_per_page; 454*14b24e2bSVaishali Kulkarni struct qede_rx_ring *rx_ring; 455*14b24e2bSVaishali Kulkarni u32 inactive; 456*14b24e2bSVaishali Kulkarni u32 buf_upstream; 457*14b24e2bSVaishali Kulkarni } qede_rx_buf_area_t; 458*14b24e2bSVaishali Kulkarni 459*14b24e2bSVaishali Kulkarni typedef struct qede_rx_ring { 460*14b24e2bSVaishali Kulkarni uint32_t rx_buf_count; 461*14b24e2bSVaishali Kulkarni uint32_t rx_buf_size; 462*14b24e2bSVaishali Kulkarni /* 463*14b24e2bSVaishali Kulkarni * Pointer to an array of producer indicies. 464*14b24e2bSVaishali Kulkarni * Returned in call to ecore_sp_eth_rx_queue_start() 465*14b24e2bSVaishali Kulkarni * during qede_start(). Driver uses address 466*14b24e2bSVaishali Kulkarni * to update producer indicies for 467*14b24e2bSVaishali Kulkarni * CQE and RX buffer chains. 468*14b24e2bSVaishali Kulkarni */ 469*14b24e2bSVaishali Kulkarni void __iomem *hw_rxq_prod_addr; 470*14b24e2bSVaishali Kulkarni 471*14b24e2bSVaishali Kulkarni /* Pointer to hw cqe consumer index. 472*14b24e2bSVaishali Kulkarni * Taken from sb_virt->pi_array after 473*14b24e2bSVaishali Kulkarni * rx_ring has been started by calling 474*14b24e2bSVaishali Kulkarni * ecore_sp_eth_rx_queue_start(). 475*14b24e2bSVaishali Kulkarni * This value is little endian and requires 476*14b24e2bSVaishali Kulkarni * swapping on big endian platforms. 477*14b24e2bSVaishali Kulkarni * It is updated by ecore and read by 478*14b24e2bSVaishali Kulkarni * the driver while processing rings. 479*14b24e2bSVaishali Kulkarni */ 480*14b24e2bSVaishali Kulkarni uint16_t *hw_cons_ptr; 481*14b24e2bSVaishali Kulkarni 482*14b24e2bSVaishali Kulkarni u16 sw_rx_cons; 483*14b24e2bSVaishali Kulkarni u16 sw_rx_prod; 484*14b24e2bSVaishali Kulkarni u16 last_cqe_consumer; 485*14b24e2bSVaishali Kulkarni 486*14b24e2bSVaishali Kulkarni /* 487*14b24e2bSVaishali Kulkarni * Driver buffer descriptor ring defining 488*14b24e2bSVaishali Kulkarni * buffers on a one-to-one releationship 489*14b24e2bSVaishali Kulkarni * to ecore_chain rx_bd_ring. 490*14b24e2bSVaishali Kulkarni */ 491*14b24e2bSVaishali Kulkarni qede_rx_buffer_t *rx_buffers; 492*14b24e2bSVaishali Kulkarni qede_rx_buf_area_t *rx_buf_area; 493*14b24e2bSVaishali Kulkarni /* 494*14b24e2bSVaishali Kulkarni * Descriptor rings returned from 495*14b24e2bSVaishali Kulkarni * ecore_chain_alloc() 496*14b24e2bSVaishali Kulkarni */ 497*14b24e2bSVaishali Kulkarni struct ecore_chain rx_bd_ring; 498*14b24e2bSVaishali Kulkarni struct ecore_chain rx_cqe_ring; 499*14b24e2bSVaishali Kulkarni 500*14b24e2bSVaishali Kulkarni uint32_t rss_id; 501*14b24e2bSVaishali Kulkarni bool queue_started; 502*14b24e2bSVaishali Kulkarni bool mac_ring_started; 503*14b24e2bSVaishali Kulkarni kmutex_t rx_lock; 504*14b24e2bSVaishali Kulkarni kmutex_t rx_replen_lock; 505*14b24e2bSVaishali Kulkarni mac_ring_handle_t mac_ring_handle; 506*14b24e2bSVaishali Kulkarni u64 mr_gen_num; /* Mac rings generation number */ 507*14b24e2bSVaishali Kulkarni uint32_t group_index; 508*14b24e2bSVaishali Kulkarni qede_fastpath_t *fp; 509*14b24e2bSVaishali Kulkarni struct qede *qede; 510*14b24e2bSVaishali Kulkarni 511*14b24e2bSVaishali Kulkarni /* dma_handles for rx dma mem */ 512*14b24e2bSVaishali Kulkarni ddi_dma_handle_t rx_bd_dmah; 513*14b24e2bSVaishali Kulkarni ddi_dma_handle_t rx_cqe_dmah; 514*14b24e2bSVaishali Kulkarni ddi_dma_handle_t rx_cqe_pbl_dmah; 515*14b24e2bSVaishali Kulkarni uint32_t rx_copy_threshold; 516*14b24e2bSVaishali Kulkarni uint32_t rx_low_buffer_threshold; 517*14b24e2bSVaishali Kulkarni struct qede_lro_info lro_info[ETH_TPA_MAX_AGGS_NUM]; 518*14b24e2bSVaishali Kulkarni uint32_t lro_active_count; 519*14b24e2bSVaishali Kulkarni 520*14b24e2bSVaishali Kulkarni uint64_t rx_copy_cnt; 521*14b24e2bSVaishali Kulkarni uint64_t rx_drop_cnt; 522*14b24e2bSVaishali Kulkarni uint64_t rx_low_water_cnt; 523*14b24e2bSVaishali Kulkarni uint64_t rx_poll_cnt; 524*14b24e2bSVaishali Kulkarni uint64_t rx_reg_pkt_cnt; 525*14b24e2bSVaishali Kulkarni uint64_t rx_jumbo_pkt_cnt; 526*14b24e2bSVaishali Kulkarni uint64_t rx_lro_pkt_cnt; 527*14b24e2bSVaishali Kulkarni uint64_t rx_byte_cnt; 528*14b24e2bSVaishali Kulkarni uint64_t rx_pkt_cnt; 529*14b24e2bSVaishali Kulkarni uint8_t intrEnableCnt; 530*14b24e2bSVaishali Kulkarni uint8_t intrDisableCnt; 531*14b24e2bSVaishali Kulkarni struct ecore_queue_cid *p_cid; 532*14b24e2bSVaishali Kulkarni } qede_rx_ring_t; 533*14b24e2bSVaishali Kulkarni 534*14b24e2bSVaishali Kulkarni typedef uint32_t qede_offload_t; 535*14b24e2bSVaishali Kulkarni typedef struct qede_params { 536*14b24e2bSVaishali Kulkarni qede_offload_t enabled_offloads; 537*14b24e2bSVaishali Kulkarni boolean_t multi_promisc_fl; 538*14b24e2bSVaishali Kulkarni boolean_t promisc_fl; 539*14b24e2bSVaishali Kulkarni uint32_t link_state; 540*14b24e2bSVaishali Kulkarni u32 loopback_mode; 541*14b24e2bSVaishali Kulkarni } qede_params_t; 542*14b24e2bSVaishali Kulkarni 543*14b24e2bSVaishali Kulkarni typedef struct qede_intr_context { 544*14b24e2bSVaishali Kulkarni /* bit field indicating enable/disable state of vector */ 545*14b24e2bSVaishali Kulkarni volatile uint32_t intr_state; 546*14b24e2bSVaishali Kulkarni qede_vector_info_t *intr_vect_info; 547*14b24e2bSVaishali Kulkarni int intr_vect_info_array_size; /* based on hw max vectors */ 548*14b24e2bSVaishali Kulkarni ddi_intr_handle_t *intr_hdl_array; /* handle array from ddi_intr_alloc() */ 549*14b24e2bSVaishali Kulkarni int intr_hdl_array_size; /* based on hw max vectors */ 550*14b24e2bSVaishali Kulkarni int intr_types_available; /* from ddi_intr_get_supported_types */ 551*14b24e2bSVaishali Kulkarni int intr_type_forced; /* from qede.conf */ 552*14b24e2bSVaishali Kulkarni int intr_type_in_use; /* interrupt type currently used */ 553*14b24e2bSVaishali Kulkarni int intr_vect_supported; /* from ddi_intr_get_nintrs */ 554*14b24e2bSVaishali Kulkarni int intr_vect_available; /* from ddi_intr_get_navail */ 555*14b24e2bSVaishali Kulkarni int intr_vect_to_request; /* intr count requested */ 556*14b24e2bSVaishali Kulkarni int intr_vect_allocated; /* intr count taken */ 557*14b24e2bSVaishali Kulkarni uint32_t intr_pri; 558*14b24e2bSVaishali Kulkarni int intr_cap; 559*14b24e2bSVaishali Kulkarni uint32_t intr_fp_vector_count; 560*14b24e2bSVaishali Kulkarni enum ecore_int_mode intr_mode; 561*14b24e2bSVaishali Kulkarni } qede_intr_context_t; 562*14b24e2bSVaishali Kulkarni 563*14b24e2bSVaishali Kulkarni #define QEDE_LINK_PAUSE_AUTONEG_ENABLE (1 << 0) 564*14b24e2bSVaishali Kulkarni #define QEDE_LINK_PAUSE_RX_ENABLE (1 << 1) 565*14b24e2bSVaishali Kulkarni #define QEDE_LINK_PAUSE_TX_ENABLE (1 << 2) 566*14b24e2bSVaishali Kulkarni 567*14b24e2bSVaishali Kulkarni typedef struct qede_props { 568*14b24e2bSVaishali Kulkarni uint32_t link_speed; 569*14b24e2bSVaishali Kulkarni boolean_t link_duplex; 570*14b24e2bSVaishali Kulkarni boolean_t tx_pause; 571*14b24e2bSVaishali Kulkarni boolean_t rx_pause; 572*14b24e2bSVaishali Kulkarni time_t uptime; 573*14b24e2bSVaishali Kulkarni } qede_props_t; 574*14b24e2bSVaishali Kulkarni 575*14b24e2bSVaishali Kulkarni typedef struct qede_link_props { 576*14b24e2bSVaishali Kulkarni uint8_t port_type; 577*14b24e2bSVaishali Kulkarni boolean_t autoneg; 578*14b24e2bSVaishali Kulkarni boolean_t asym_pause; 579*14b24e2bSVaishali Kulkarni boolean_t pause; 580*14b24e2bSVaishali Kulkarni boolean_t param_100000fdx; 581*14b24e2bSVaishali Kulkarni boolean_t param_50000fdx; 582*14b24e2bSVaishali Kulkarni boolean_t param_40000fdx; 583*14b24e2bSVaishali Kulkarni boolean_t param_25000fdx; 584*14b24e2bSVaishali Kulkarni boolean_t param_10000fdx; 585*14b24e2bSVaishali Kulkarni boolean_t param_1000fdx; 586*14b24e2bSVaishali Kulkarni boolean_t param_1000hdx; 587*14b24e2bSVaishali Kulkarni } qede_link_props_t; 588*14b24e2bSVaishali Kulkarni 589*14b24e2bSVaishali Kulkarni typedef struct qede_link_cfg { 590*14b24e2bSVaishali Kulkarni boolean_t link_up; 591*14b24e2bSVaishali Kulkarni uint32_t speed; 592*14b24e2bSVaishali Kulkarni uint8_t duplex; 593*14b24e2bSVaishali Kulkarni uint8_t port; 594*14b24e2bSVaishali Kulkarni boolean_t autoneg; 595*14b24e2bSVaishali Kulkarni uint32_t pause_cfg; 596*14b24e2bSVaishali Kulkarni qede_link_props_t supp_capab; 597*14b24e2bSVaishali Kulkarni qede_link_props_t adv_capab; 598*14b24e2bSVaishali Kulkarni qede_link_props_t rem_capab; 599*14b24e2bSVaishali Kulkarni } qede_link_cfg_t; 600*14b24e2bSVaishali Kulkarni 601*14b24e2bSVaishali Kulkarni enum qede_filter_type { 602*14b24e2bSVaishali Kulkarni QEDE_FILTER_UCAST, 603*14b24e2bSVaishali Kulkarni QEDE_FILTER_MCAST, 604*14b24e2bSVaishali Kulkarni QEDE_FILTER_RX_MODE, 605*14b24e2bSVaishali Kulkarni QEDE_MAX_FILTER_TYPES, 606*14b24e2bSVaishali Kulkarni 607*14b24e2bSVaishali Kulkarni }; 608*14b24e2bSVaishali Kulkarni 609*14b24e2bSVaishali Kulkarni enum qede_filter_rx_mode_type { 610*14b24e2bSVaishali Kulkarni QEDE_FILTER_RX_MODE_REGULAR, 611*14b24e2bSVaishali Kulkarni QEDE_FILTER_RX_MODE_MULTI_PROMISC, 612*14b24e2bSVaishali Kulkarni QEDE_FILTER_RX_MODE_PROMISC, 613*14b24e2bSVaishali Kulkarni }; 614*14b24e2bSVaishali Kulkarni 615*14b24e2bSVaishali Kulkarni 616*14b24e2bSVaishali Kulkarni 617*14b24e2bSVaishali Kulkarni struct qede_mcast_filter_params { 618*14b24e2bSVaishali Kulkarni enum qede_filter_rx_mode_type acc_flg; 619*14b24e2bSVaishali Kulkarni struct ecore_filter_mcast mcast; 620*14b24e2bSVaishali Kulkarni }; 621*14b24e2bSVaishali Kulkarni 622*14b24e2bSVaishali Kulkarni #define QEDE_MAX_UCST_CNT 8 623*14b24e2bSVaishali Kulkarni typedef struct qede_mac_addr { 624*14b24e2bSVaishali Kulkarni struct ether_addr mac_addr; 625*14b24e2bSVaishali Kulkarni boolean_t set; 626*14b24e2bSVaishali Kulkarni } qede_mac_addr_t; 627*14b24e2bSVaishali Kulkarni 628*14b24e2bSVaishali Kulkarni 629*14b24e2bSVaishali Kulkarni 630*14b24e2bSVaishali Kulkarni enum qede_state { 631*14b24e2bSVaishali Kulkarni QEDE_STATE_UNKNOWN, 632*14b24e2bSVaishali Kulkarni QEDE_STATE_ATTACHED, 633*14b24e2bSVaishali Kulkarni QEDE_STATE_STARTING, /* Transitioning State */ 634*14b24e2bSVaishali Kulkarni QEDE_STATE_STARTED, 635*14b24e2bSVaishali Kulkarni QEDE_STATE_STOPPING, /* Transitioning State */ 636*14b24e2bSVaishali Kulkarni QEDE_STATE_STOPPED, 637*14b24e2bSVaishali Kulkarni QEDE_STATE_SUSPENDING, /* Transitioning State */ 638*14b24e2bSVaishali Kulkarni QEDE_STATE_SUSPENDED, 639*14b24e2bSVaishali Kulkarni QEDE_STATE_RESUMING, /* Transitioning State */ 640*14b24e2bSVaishali Kulkarni QEDE_STATE_FAILED, 641*14b24e2bSVaishali Kulkarni }; 642*14b24e2bSVaishali Kulkarni 643*14b24e2bSVaishali Kulkarni enum qede_attach_resources { 644*14b24e2bSVaishali Kulkarni QEDE_STRUCT_ALLOC = (1 << 0), 645*14b24e2bSVaishali Kulkarni QEDE_FM = (1 << 1), 646*14b24e2bSVaishali Kulkarni QEDE_PCI = (1 << 2), 647*14b24e2bSVaishali Kulkarni QEDE_ECORE_HW_PREP = (1 << 3), 648*14b24e2bSVaishali Kulkarni QEDE_SET_PARAMS = (1 << 4), 649*14b24e2bSVaishali Kulkarni QEDE_CALLBACK = (1 << 5), 650*14b24e2bSVaishali Kulkarni QEDE_IO_STRUCT_ALLOC = (1 << 6), 651*14b24e2bSVaishali Kulkarni QEDE_INIT_LOCKS = (1 << 7), 652*14b24e2bSVaishali Kulkarni QEDE_INTR_ALLOC = (1 << 8), 653*14b24e2bSVaishali Kulkarni QEDE_INTR_CONFIG = (1 << 9), 654*14b24e2bSVaishali Kulkarni QEDE_EDEV_CONFIG = (1 << 10), 655*14b24e2bSVaishali Kulkarni QEDE_KSTAT_INIT = (1 << 11), 656*14b24e2bSVaishali Kulkarni QEDE_GLD_INIT = (1 << 12), 657*14b24e2bSVaishali Kulkarni QEDE_SP_INTR_ENBL = (1 << 13), 658*14b24e2bSVaishali Kulkarni QEDE_ECORE_HW_INIT = (1 << 14), 659*14b24e2bSVaishali Kulkarni /* 660*14b24e2bSVaishali Kulkarni = (1 << 15), 661*14b24e2bSVaishali Kulkarni = (1 << 16), 662*14b24e2bSVaishali Kulkarni = (1 << 17), 663*14b24e2bSVaishali Kulkarni = (1 << 18), 664*14b24e2bSVaishali Kulkarni = (1 << 19), 665*14b24e2bSVaishali Kulkarni = (1 << 20), 666*14b24e2bSVaishali Kulkarni */ 667*14b24e2bSVaishali Kulkarni }; 668*14b24e2bSVaishali Kulkarni 669*14b24e2bSVaishali Kulkarni enum qede_vport_state { 670*14b24e2bSVaishali Kulkarni QEDE_VPORT_UNKNOWN, 671*14b24e2bSVaishali Kulkarni QEDE_VPORT_STARTED, 672*14b24e2bSVaishali Kulkarni QEDE_VPORT_ON, 673*14b24e2bSVaishali Kulkarni QEDE_VPORT_OFF, 674*14b24e2bSVaishali Kulkarni QEDE_VPORT_STOPPED 675*14b24e2bSVaishali Kulkarni }; 676*14b24e2bSVaishali Kulkarni 677*14b24e2bSVaishali Kulkarni #define QEDE_MAX_GROUPS 1 678*14b24e2bSVaishali Kulkarni typedef struct qede_mac_group { 679*14b24e2bSVaishali Kulkarni int group_index; 680*14b24e2bSVaishali Kulkarni mac_group_handle_t group_handle; 681*14b24e2bSVaishali Kulkarni struct qede *qede; 682*14b24e2bSVaishali Kulkarni } qede_mac_group_t; 683*14b24e2bSVaishali Kulkarni 684*14b24e2bSVaishali Kulkarni typedef struct qede_link_input_params { 685*14b24e2bSVaishali Kulkarni struct ecore_mcp_link_params default_link_params; 686*14b24e2bSVaishali Kulkarni u32 loopback_mode; 687*14b24e2bSVaishali Kulkarni }qede_link_input_params_t; 688*14b24e2bSVaishali Kulkarni 689*14b24e2bSVaishali Kulkarni typedef struct qede { 690*14b24e2bSVaishali Kulkarni struct ecore_dev edev; /* keep this at the beginning of the structure */ 691*14b24e2bSVaishali Kulkarni dev_info_t *dip; 692*14b24e2bSVaishali Kulkarni int instance; 693*14b24e2bSVaishali Kulkarni enum qede_state qede_state; 694*14b24e2bSVaishali Kulkarni #define MAX_QEDE_NAME_LEN 8 695*14b24e2bSVaishali Kulkarni char name[MAX_QEDE_NAME_LEN]; 696*14b24e2bSVaishali Kulkarni 697*14b24e2bSVaishali Kulkarni /* PCI access handle */ 698*14b24e2bSVaishali Kulkarni ddi_acc_handle_t pci_cfg_handle; 699*14b24e2bSVaishali Kulkarni 700*14b24e2bSVaishali Kulkarni /* BAR 0 - registers */ 701*14b24e2bSVaishali Kulkarni ddi_acc_handle_t regs_handle; 702*14b24e2bSVaishali Kulkarni off_t regview_size; 703*14b24e2bSVaishali Kulkarni caddr_t regview; 704*14b24e2bSVaishali Kulkarni uint64_t pci_bar0_base; 705*14b24e2bSVaishali Kulkarni 706*14b24e2bSVaishali Kulkarni /* BAR 2 - doorbell */ 707*14b24e2bSVaishali Kulkarni ddi_acc_handle_t doorbell_handle; 708*14b24e2bSVaishali Kulkarni off_t doorbell_size; 709*14b24e2bSVaishali Kulkarni caddr_t doorbell; 710*14b24e2bSVaishali Kulkarni uint64_t pci_bar2_base; 711*14b24e2bSVaishali Kulkarni 712*14b24e2bSVaishali Kulkarni /* Vport params */ 713*14b24e2bSVaishali Kulkarni struct ecore_sp_vport_update_params vport_params[MAX_HWFNS_PER_DEVICE]; 714*14b24e2bSVaishali Kulkarni struct ecore_rss_params rss_params[MAX_HWFNS_PER_DEVICE]; 715*14b24e2bSVaishali Kulkarni enum qede_vport_state vport_state[MAX_HWFNS_PER_DEVICE]; 716*14b24e2bSVaishali Kulkarni 717*14b24e2bSVaishali Kulkarni /* mac Layer related vars */ 718*14b24e2bSVaishali Kulkarni mac_handle_t mac_handle; 719*14b24e2bSVaishali Kulkarni qede_mac_group_t rx_groups[QEDE_MAX_GROUPS]; 720*14b24e2bSVaishali Kulkarni qede_mac_group_t tx_groups[QEDE_MAX_GROUPS]; 721*14b24e2bSVaishali Kulkarni 722*14b24e2bSVaishali Kulkarni u8 *sp_dpc; 723*14b24e2bSVaishali Kulkarni /* 724*14b24e2bSVaishali Kulkarni * pre-mapped buffer cache handle for TX 725*14b24e2bSVaishali Kulkarni * used for getting sglist for mbkls 726*14b24e2bSVaishali Kulkarni * that were already mapped in mac layer 727*14b24e2bSVaishali Kulkarni */ 728*14b24e2bSVaishali Kulkarni #ifdef DBLK_DMA_PREMAP 729*14b24e2bSVaishali Kulkarni pm_handle_t pm_handle; 730*14b24e2bSVaishali Kulkarni #endif 731*14b24e2bSVaishali Kulkarni 732*14b24e2bSVaishali Kulkarni /* current operating paramters */ 733*14b24e2bSVaishali Kulkarni uint32_t mtu; 734*14b24e2bSVaishali Kulkarni uint32_t num_fp; 735*14b24e2bSVaishali Kulkarni uint32_t mc_cnt; 736*14b24e2bSVaishali Kulkarni 737*14b24e2bSVaishali Kulkarni uint32_t tx_ring_size; 738*14b24e2bSVaishali Kulkarni uint32_t tx_buf_size; 739*14b24e2bSVaishali Kulkarni uint16_t tx_recycle_threshold; 740*14b24e2bSVaishali Kulkarni u16 pad; // remove later 741*14b24e2bSVaishali Kulkarni 742*14b24e2bSVaishali Kulkarni int checksum; 743*14b24e2bSVaishali Kulkarni qede_offload_t enabled_offloads; 744*14b24e2bSVaishali Kulkarni uint32_t rx_ring_size; 745*14b24e2bSVaishali Kulkarni uint32_t rx_buf_count; 746*14b24e2bSVaishali Kulkarni uint32_t rx_buf_size; 747*14b24e2bSVaishali Kulkarni uint32_t rx_copy_threshold; 748*14b24e2bSVaishali Kulkarni uint32_t rx_low_buffer_threshold; 749*14b24e2bSVaishali Kulkarni boolean_t lso_enable; 750*14b24e2bSVaishali Kulkarni boolean_t lro_enable; 751*14b24e2bSVaishali Kulkarni boolean_t jumbo_enable; 752*14b24e2bSVaishali Kulkarni boolean_t log_enable; 753*14b24e2bSVaishali Kulkarni uint32_t ecore_debug_level; 754*14b24e2bSVaishali Kulkarni uint32_t ecore_debug_module; 755*14b24e2bSVaishali Kulkarni boolean_t intr_coalesce; 756*14b24e2bSVaishali Kulkarni uint32_t intr_rx_coal_usec; 757*14b24e2bSVaishali Kulkarni uint32_t intr_tx_coal_usec; 758*14b24e2bSVaishali Kulkarni 759*14b24e2bSVaishali Kulkarni /* From ecore_hw_init */ 760*14b24e2bSVaishali Kulkarni uint32_t num_hwfns; 761*14b24e2bSVaishali Kulkarni unsigned char ether_addr[ETHERADDRL]; 762*14b24e2bSVaishali Kulkarni uint32_t num_tc; 763*14b24e2bSVaishali Kulkarni 764*14b24e2bSVaishali Kulkarni qede_mac_addr_t ucst_mac[QEDE_MAX_UCST_CNT]; 765*14b24e2bSVaishali Kulkarni uint32_t ucst_total; 766*14b24e2bSVaishali Kulkarni uint32_t ucst_avail; 767*14b24e2bSVaishali Kulkarni qede_mac_addr_t suspnd_mac_list[QEDE_MAX_UCST_CNT]; 768*14b24e2bSVaishali Kulkarni 769*14b24e2bSVaishali Kulkarni 770*14b24e2bSVaishali Kulkarni /* software data structures for tx/rx */ 771*14b24e2bSVaishali Kulkarni qede_intr_context_t intr_ctx; 772*14b24e2bSVaishali Kulkarni qede_fastpath_t fp_array[MAX_FASTPATH_COUNT]; 773*14b24e2bSVaishali Kulkarni struct ecore_sb_info sb_array[MAX_FASTPATH_COUNT]; 774*14b24e2bSVaishali Kulkarni qede_rx_ring_t rx_array[MAX_FASTPATH_COUNT]; 775*14b24e2bSVaishali Kulkarni qede_tx_ring_t tx_array[MAX_TC_COUNT][MAX_FASTPATH_COUNT]; 776*14b24e2bSVaishali Kulkarni 777*14b24e2bSVaishali Kulkarni uint16_t tx_bcopy_threshold; 778*14b24e2bSVaishali Kulkarni uint16_t pad1; /* remove later */ 779*14b24e2bSVaishali Kulkarni