1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2009 Emulex. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * Driver specific data structures and function prototypes 29 */ 30 31 #ifndef _OCE_IMPL_H_ 32 #define _OCE_IMPL_H_ 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 #include <sys/types.h> 39 #include <sys/dditypes.h> 40 #include <sys/kstat.h> 41 #include <sys/ddi_intr.h> 42 #include <sys/cmn_err.h> 43 #include <sys/byteorder.h> 44 #include <sys/mac_provider.h> 45 #include <sys/mac_ether.h> 46 #include <sys/vlan.h> 47 #include <sys/bitmap.h> 48 #include <sys/ddidmareq.h> 49 #include <sys/kmem.h> 50 #include <sys/ddi.h> 51 #include <sys/sunddi.h> 52 #include <sys/modctl.h> 53 #include <sys/devops.h> 54 #include <sys/systm.h> 55 #include <sys/conf.h> 56 #include <sys/dlpi.h> 57 #include <sys/ethernet.h> 58 #include <sys/strsun.h> 59 #include <sys/pattr.h> 60 #include <sys/strsubr.h> 61 #include <sys/ddifm.h> 62 #include <sys/fm/protocol.h> 63 #include <sys/fm/util.h> 64 #include <sys/fm/io/ddi.h> 65 #include <sys/note.h> 66 #include <oce_hw.h> 67 #include <oce_hw_eth.h> 68 #include <oce_io.h> 69 #include <oce_buf.h> 70 #include <oce_utils.h> 71 #include <oce_version.h> 72 73 #define OCE_MIN_MTU 1500 74 #define OCE_MAX_MTU 9000 75 #define OCE_MAX_MCA 32 76 #define OCE_RQ_MAX_FRAME_SZ 9018 77 78 #define OCE_MAX_EQ 8 79 #define OCE_MAX_CQ 1024 80 #define OCE_MAX_WQ 8 81 #define OCE_WQ_NUM_BUFFERS 2048 82 #define OCE_WQ_BUF_SIZE 2048 83 #define OCE_LSO_MAX_SIZE (32 * 1024) 84 #define OCE_DEFAULT_TX_BCOPY_LIMIT 1024 85 #define OCE_DEFAULT_RX_BCOPY_LIMIT 128 86 #define OCE_DEFAULT_WQ_EQD 16 87 88 #define OCE_MAX_RQ 8 89 #define OCE_MAX_RQ_POSTS 255 90 #define OCE_RQ_NUM_BUFFERS 2048 91 #define OCE_RQ_BUF_SIZE 2048 92 #define OCE_DEFAULT_RECHARGE_THRESHOLD OCE_MAX_RQ_POSTS 93 #define OCE_NUM_USED_VECTORS 2 94 #define OCE_DMA_ALIGNMENT 0x1000ull 95 96 #define OCE_DEFAULT_TX_RING_SIZE 2048 97 #define OCE_DEFAULT_RX_RING_SIZE 1024 98 99 #define OCE_INVAL_IF_ID -1 100 101 #define OCE_DEFAULT_IF_CAP (MBX_RX_IFACE_FLAGS_PROMISCUOUS | \ 102 MBX_RX_IFACE_FLAGS_BROADCAST | \ 103 MBX_RX_IFACE_FLAGS_UNTAGGED | \ 104 MBX_RX_IFACE_FLAGS_MCAST_PROMISCUOUS | \ 105 MBX_RX_IFACE_FLAGS_PASS_L3L4) 106 107 #define OCE_DEFAULT_IF_CAP_EN (MBX_RX_IFACE_FLAGS_BROADCAST | \ 108 MBX_RX_IFACE_FLAGS_UNTAGGED | \ 109 MBX_RX_IFACE_FLAGS_MCAST_PROMISCUOUS | \ 110 MBX_RX_IFACE_FLAGS_PASS_L3L4) 111 112 #define OCE_RX_FILTER_GLOBAL_FLAGS (NTWK_RX_FILTER_IP_CKSUM | \ 113 NTWK_RX_FILTER_TCP_CKSUM | \ 114 NTWK_RX_FILTER_UDP_CKSUM | \ 115 NTWK_RX_FILTER_STRIP_CRC) 116 117 118 #define OCE_FM_CAPABILITY DDI_FM_EREPORT_CAPABLE | \ 119 DDI_FM_ACCCHK_CAPABLE | \ 120 DDI_FM_DMACHK_CAPABLE 121 122 /* flow control definitions */ 123 #define OCE_FC_NONE 0x00000000 124 #define OCE_FC_TX 0x00000001 125 #define OCE_FC_RX 0x00000002 126 #define OCE_DEFAULT_FLOW_CONTROL (OCE_FC_TX | OCE_FC_RX) 127 128 /* PCI Information */ 129 #define OCE_DEV_CFG_BAR 0x01 130 #define OCE_PCI_CSR_BAR 0x02 131 #define OCE_PCI_DB_BAR 0x03 132 133 /* macros for device IO */ 134 #define OCE_READ_REG32(handle, addr) ddi_get32(handle, addr) 135 #define OCE_WRITE_REG32(handle, addr, value) ddi_put32(handle, addr, value) 136 137 #define OCE_CSR_READ32(dev, offset) \ 138 OCE_READ_REG32((dev)->csr_handle, \ 139 (uint32_t *)(void *)((dev)->csr_addr + offset)) 140 141 #define OCE_CSR_WRITE32(dev, offset, value) \ 142 OCE_WRITE_REG32((dev)->csr_handle, \ 143 (uint32_t *)(void *)((dev)->csr_addr + offset), value) 144 145 #define OCE_DB_READ32(dev, offset) \ 146 OCE_READ_REG32((dev)->db_handle, \ 147 (uint32_t *)(void *)((dev)->db_addr + offset)) 148 149 #define OCE_DB_WRITE32(dev, offset, value) \ 150 OCE_WRITE_REG32((dev)->db_handle, \ 151 (uint32_t *)(void *)((dev)->db_addr + offset), value) 152 153 #define OCE_CFG_READ32(dev, offset) \ 154 OCE_READ_REG32((dev)->dev_cfg_handle, \ 155 (uint32_t *)(void *)((dev)->dev_cfg_addr + offset)) 156 157 #define OCE_CFG_WRITE32(dev, offset, value) \ 158 OCE_WRITE_REG32((dev)->dev_cfg_handle, \ 159 (uint32_t *)(void *)((dev)->dev_cfg_addr + offset), value) 160 161 #define OCE_PCI_FUNC(dev) \ 162 ((OCE_CFG_READ32(dev, PCICFG_INTR_CTRL) \ 163 >> HOSTINTR_PFUNC_SHIFT) & HOSTINTR_PFUNC_MASK) 164 165 #define DEV_LOCK(dev) mutex_enter(&dev->dev_lock) 166 167 #define DEV_UNLOCK(dev) mutex_exit(&dev->dev_lock) 168 169 enum oce_ring_size { 170 RING_SIZE_256 = 256, 171 RING_SIZE_512 = 512, 172 RING_SIZE_1024 = 1024, 173 RING_SIZE_2048 = 2048 174 }; 175 176 enum oce_driver_state { 177 STATE_INIT = 0x2, 178 STATE_MAC_STARTED = 0x4, 179 STATE_QUIESCE = 0x8, 180 STATE_MAC_STOPPING = 0x10 181 }; 182 183 struct oce_dev { 184 uint32_t dev_id; /* device ID or instance number */ 185 int32_t if_id; /* IF ID */ 186 uint8_t fn; /* function number */ 187 uint8_t fw_version[32]; /* fw version string */ 188 enum oce_driver_state state; /* state */ 189 struct oce_mq *mq; /* MQ ring */ 190 oce_dma_buf_t *bmbx; /* Bootstrap MailBox */ 191 kmutex_t bmbx_lock; /* Bootstrap Lock */ 192 uint16_t mod_mask; /* Log Mask */ 193 int16_t severity; /* Log level */ 194 struct oce_wq *wq[OCE_MAX_WQ]; /* TXQ Array */ 195 struct oce_rq *rq[OCE_MAX_RQ]; /* RXQ Array */ 196 struct oce_cq *cq[OCE_MAX_CQ]; /* Completion Queues */ 197 struct oce_eq *eq[OCE_MAX_EQ]; /* Event Queues */ 198 uint32_t tx_bcopy_limit; /* TX BCOPY Limit */ 199 uint32_t rx_bcopy_limit; /* RX BCOPY Limit */ 200 201 uint32_t cookie; 202 203 clock_t stat_ticks; 204 uint32_t in_stats; 205 206 /* Add implementation specific stuff here */ 207 ddi_acc_handle_t pci_cfg_handle; /* Config space handle */ 208 int num_bars; 209 ddi_acc_handle_t cfg_handle; /* MMIO PCI Config Space Regs */ 210 caddr_t csr_addr; 211 ddi_acc_handle_t csr_handle; /* MMIO Control Status Regs */ 212 caddr_t db_addr; 213 ddi_acc_handle_t db_handle; /* MMIO DoorBell Area */ 214 caddr_t dev_cfg_addr; 215 ddi_acc_handle_t dev_cfg_handle; /* MMIO CONFIG SPACE */ 216 mac_handle_t mac_handle; /* MAC HANDLE */ 217 218 /* device info structure for device tree node */ 219 dev_info_t *dip; 220 kstat_t *oce_kstats; /* NIC STATS */ 221 oce_dma_buf_t *stats_dbuf; /* STATS BUFFER */ 222 struct mbx_get_nic_stats *hw_stats; 223 /* dev stats */ 224 uint32_t tx_errors; 225 uint32_t tx_noxmtbuf; 226 227 /* link status */ 228 struct link_status link; 229 230 /* flow control settings */ 231 uint32_t flow_control; 232 233 /* the type of interrupts supported */ 234 int intr_types; 235 /* number of vectors used */ 236 int num_vectors; 237 /* interrupt priority */ 238 uint_t intr_pri; 239 int intr_cap; 240 /* intr handler table */ 241 ddi_intr_handle_t *htable; 242 243 /* lock for device */ 244 kmutex_t dev_lock; 245 246 /* hardware mac address */ 247 uint8_t mac_addr[ETHERADDRL]; 248 249 /* Current Multicast address table that we have set to h/w */ 250 uint16_t num_mca; 251 struct ether_addr multi_cast[OCE_MAX_MCA]; 252 253 /* device configuration */ 254 uint32_t pmac_id; /* used to add or remove mac */ 255 uint8_t unicast_addr[ETHERADDRL]; 256 uint32_t mtu; 257 enum oce_ring_size tx_ring_size; 258 enum oce_ring_size rx_ring_size; 259 boolean_t lso_capable; 260 boolean_t promisc; 261 uint32_t if_cap_flags; 262 int32_t fm_caps; 263 uint32_t attach_state; 264 boolean_t suspended; 265 uint32_t neqs; /* No of event queues */ 266 uint32_t nwqs; /* No of Work Queues */ 267 uint32_t nrqs; /* No of Receive Queues */ 268 uint32_t nifs; /* No of interfaces created */ 269 270 /* fw config: only relevant fields */ 271 uint32_t config_number; 272 uint32_t asic_revision; 273 uint32_t port_id; 274 uint32_t function_mode; 275 }; 276 277 /* GLD handler functions */ 278 int oce_m_start(void *arg); 279 void oce_m_stop(void *arg); 280 mblk_t *oce_m_send(void *arg, mblk_t *pkt); 281 int oce_m_promiscuous(void *arg, boolean_t enable); 282 int oce_m_multicast(void *arg, boolean_t add, const uint8_t *mca); 283 int oce_m_unicast(void *arg, const uint8_t *uca); 284 boolean_t oce_m_getcap(void *arg, mac_capab_t cap, void *data); 285 void oce_m_ioctl(void *arg, queue_t *wq, mblk_t *mp); 286 int oce_m_setprop(void *arg, const char *name, mac_prop_id_t id, 287 uint_t size, const void *val); 288 int oce_m_getprop(void *arg, const char *name, mac_prop_id_t id, 289 uint_t size, void *val); 290 void oce_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t pr_num, 291 mac_prop_info_handle_t prh); 292 293 int oce_m_stat(void *arg, uint_t stat, uint64_t *val); 294 295 /* Hardware start/stop functions */ 296 int oce_start(struct oce_dev *dev); 297 void oce_stop(struct oce_dev *dev); 298 299 /* FMA support Functions */ 300 void oce_fm_init(struct oce_dev *dev); 301 void oce_fm_fini(struct oce_dev *dev); 302 void oce_set_dma_fma_flags(int fm_caps); 303 void oce_set_reg_fma_flags(int fm_caps); 304 void oce_set_tx_map_dma_fma_flags(int fm_caps); 305 void oce_fm_ereport(struct oce_dev *dev, char *detail); 306 int oce_fm_check_acc_handle(struct oce_dev *dev, 307 ddi_acc_handle_t acc_handle); 308 int oce_fm_check_dma_handle(struct oce_dev *dev, 309 ddi_dma_handle_t dma_handle); 310 311 /* Interrupt handling */ 312 int oce_setup_intr(struct oce_dev *dev); 313 int oce_alloc_intr(struct oce_dev *dev); 314 int oce_teardown_intr(struct oce_dev *dev); 315 int oce_setup_handlers(struct oce_dev *dev); 316 void oce_remove_handler(struct oce_dev *dev); 317 void oce_ei(struct oce_dev *dev); 318 void oce_di(struct oce_dev *dev); 319 void oce_chip_ei(struct oce_dev *dev); 320 void oce_chip_di(struct oce_dev *dev); 321 322 /* HW initialisation */ 323 int oce_hw_init(struct oce_dev *dev); 324 void oce_hw_fini(struct oce_dev *dev); 325 int oce_setup_adapter(struct oce_dev *dev); 326 void oce_unsetup_adapter(struct oce_dev *dev); 327 328 #ifdef __cplusplus 329 } 330 #endif 331 332 #endif /* _OCE_IMPL_H_ */ 333