1 /* 2 * Copyright (c) 2013-2014 Qlogic Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * POSSIBILITY OF SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 */ 29 30 /* 31 * File: qls_def.h 32 * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656. 33 */ 34 35 #ifndef _QLS_DEF_H_ 36 #define _QLS_DEF_H_ 37 38 /* 39 * structure encapsulating a DMA buffer 40 */ 41 struct qla_dma { 42 bus_size_t alignment; 43 uint32_t size; 44 void *dma_b; 45 bus_addr_t dma_addr; 46 bus_dmamap_t dma_map; 47 bus_dma_tag_t dma_tag; 48 }; 49 typedef struct qla_dma qla_dma_t; 50 51 /* 52 * structure encapsulating interrupt vectors 53 */ 54 struct qla_ivec { 55 uint32_t cq_idx; 56 void *ha; 57 struct resource *irq; 58 void *handle; 59 int irq_rid; 60 }; 61 typedef struct qla_ivec qla_ivec_t; 62 63 /* 64 * Transmit Related Definitions 65 */ 66 67 #define MAX_TX_RINGS 1 68 #define NUM_TX_DESCRIPTORS 1024 69 70 #define QLA_MAX_SEGMENTS 64 /* maximum # of segs in a sg list */ 71 #define QLA_OAL_BLK_SIZE (sizeof (q81_txb_desc_t) * QLA_MAX_SEGMENTS) 72 73 #define QLA_TX_OALB_TOTAL_SIZE (NUM_TX_DESCRIPTORS * QLA_OAL_BLK_SIZE) 74 75 #define QLA_TX_PRIVATE_BSIZE ((QLA_TX_OALB_TOTAL_SIZE + \ 76 PAGE_SIZE + \ 77 (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1)) 78 79 #define QLA_MAX_MTU 9000 80 #define QLA_STD_FRAME_SIZE 1514 81 #define QLA_MAX_TSO_FRAME_SIZE ((64 * 1024 - 1) + 22) 82 83 #define QL_FRAME_HDR_SIZE (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN +\ 84 sizeof (struct ip6_hdr) + sizeof (struct tcphdr) + 16) 85 86 struct qla_tx_buf { 87 struct mbuf *m_head; 88 bus_dmamap_t map; 89 90 /* The number of entries in the OAL is determined by QLA_MAX_SEGMENTS */ 91 bus_addr_t oal_paddr; 92 void *oal_vaddr; 93 }; 94 typedef struct qla_tx_buf qla_tx_buf_t; 95 96 struct qla_tx_ring { 97 98 volatile struct { 99 uint32_t wq_dma:1, 100 privb_dma:1; 101 } flags; 102 103 qla_dma_t privb_dma; 104 qla_dma_t wq_dma; 105 106 qla_tx_buf_t tx_buf[NUM_TX_DESCRIPTORS]; 107 uint64_t count; 108 109 struct resource *wq_db_addr; 110 uint32_t wq_db_offset; 111 112 q81_tx_cmd_t *wq_vaddr; 113 bus_addr_t wq_paddr; 114 115 void *wq_icb_vaddr; 116 bus_addr_t wq_icb_paddr; 117 118 uint32_t *txr_cons_vaddr; 119 bus_addr_t txr_cons_paddr; 120 121 volatile uint32_t txr_free; /* # of free entries in tx ring */ 122 volatile uint32_t txr_next; /* # next available tx ring entry */ 123 volatile uint32_t txr_done; 124 125 uint64_t tx_frames; 126 uint64_t tx_tso_frames; 127 uint64_t tx_vlan_frames; 128 }; 129 typedef struct qla_tx_ring qla_tx_ring_t; 130 131 /* 132 * Receive Related Definitions 133 */ 134 135 #define MAX_RX_RINGS MAX_TX_RINGS 136 137 #define NUM_RX_DESCRIPTORS 1024 138 #define NUM_CQ_ENTRIES NUM_RX_DESCRIPTORS 139 140 #define QLA_LGB_SIZE (12 * 1024) 141 #define QLA_NUM_LGB_ENTRIES 32 142 143 #define QLA_LBQ_SIZE (QLA_NUM_LGB_ENTRIES * sizeof(q81_bq_addr_e_t)) 144 145 #define QLA_LGBQ_AND_TABLE_SIZE \ 146 ((QLA_LBQ_SIZE + PAGE_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1)) 147 148 149 /* Please note that Small Buffer size is determined by max mtu size */ 150 #define QLA_NUM_SMB_ENTRIES NUM_RX_DESCRIPTORS 151 152 #define QLA_SBQ_SIZE (QLA_NUM_SMB_ENTRIES * sizeof(q81_bq_addr_e_t)) 153 154 #define QLA_SMBQ_AND_TABLE_SIZE \ 155 ((QLA_SBQ_SIZE + PAGE_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1)) 156 157 struct qla_rx_buf { 158 struct mbuf *m_head; 159 bus_dmamap_t map; 160 bus_addr_t paddr; 161 void *next; 162 }; 163 typedef struct qla_rx_buf qla_rx_buf_t; 164 165 struct qla_rx_ring { 166 volatile struct { 167 uint32_t cq_dma:1, 168 lbq_dma:1, 169 sbq_dma:1, 170 lb_dma:1; 171 } flags; 172 173 qla_dma_t cq_dma; 174 qla_dma_t lbq_dma; 175 qla_dma_t sbq_dma; 176 qla_dma_t lb_dma; 177 178 struct lro_ctrl lro; 179 180 qla_rx_buf_t rx_buf[NUM_RX_DESCRIPTORS]; 181 qla_rx_buf_t *rxb_free; 182 uint32_t rx_free; 183 uint32_t rx_next; 184 185 uint32_t cq_db_offset; 186 187 void *cq_icb_vaddr; 188 bus_addr_t cq_icb_paddr; 189 190 uint32_t *cqi_vaddr; 191 bus_addr_t cqi_paddr; 192 193 void *cq_base_vaddr; 194 bus_addr_t cq_base_paddr; 195 uint32_t cq_next; /* next cq entry to process */ 196 197 void *lbq_addr_tbl_vaddr; 198 bus_addr_t lbq_addr_tbl_paddr; 199 200 void *lbq_vaddr; 201 bus_addr_t lbq_paddr; 202 uint32_t lbq_next; /* next entry in LBQ to process */ 203 uint32_t lbq_free;/* # of entries in LBQ to arm */ 204 uint32_t lbq_in; /* next entry in LBQ to arm */ 205 206 void *lb_vaddr; 207 bus_addr_t lb_paddr; 208 209 void *sbq_addr_tbl_vaddr; 210 bus_addr_t sbq_addr_tbl_paddr; 211 212 void *sbq_vaddr; 213 bus_addr_t sbq_paddr; 214 uint32_t sbq_next; /* next entry in SBQ to process */ 215 uint32_t sbq_free;/* # of entries in SBQ to arm */ 216 uint32_t sbq_in; /* next entry in SBQ to arm */ 217 218 uint64_t rx_int; 219 uint64_t rss_int; 220 }; 221 typedef struct qla_rx_ring qla_rx_ring_t; 222 223 224 #define QLA_WATCHDOG_CALLOUT_TICKS 1 225 226 /* 227 * Multicast Definitions 228 */ 229 typedef struct _qla_mcast { 230 uint16_t rsrvd; 231 uint8_t addr[6]; 232 } __packed qla_mcast_t; 233 234 /* 235 * Misc. definitions 236 */ 237 #define QLA_PAGE_SIZE 4096 238 239 /* 240 * Adapter structure contains the hardware independant information of the 241 * pci function. 242 */ 243 struct qla_host { 244 volatile struct { 245 volatile uint32_t 246 mpi_dma :1, 247 rss_dma :1, 248 intr_enable :1, 249 qla_callout_init :1, 250 qla_watchdog_active :1, 251 qla_watchdog_exit :1, 252 qla_watchdog_pause :1, 253 lro_init :1, 254 parent_tag :1, 255 lock_init :1; 256 } flags; 257 258 volatile uint32_t hw_init; 259 260 volatile uint32_t qla_watchdog_exited; 261 volatile uint32_t qla_watchdog_paused; 262 volatile uint32_t qla_initiate_recovery; 263 264 device_t pci_dev; 265 266 uint8_t pci_func; 267 uint16_t watchdog_ticks; 268 uint8_t resvd; 269 270 /* ioctl related */ 271 struct cdev *ioctl_dev; 272 273 /* register mapping */ 274 struct resource *pci_reg; 275 int reg_rid; 276 277 struct resource *pci_reg1; 278 int reg_rid1; 279 280 int msix_count; 281 qla_ivec_t irq_vec[MAX_RX_RINGS]; 282 283 /* parent dma tag */ 284 bus_dma_tag_t parent_tag; 285 286 /* interface to o.s */ 287 struct ifnet *ifp; 288 289 struct ifmedia media; 290 uint16_t max_frame_size; 291 uint16_t rsrvd0; 292 uint32_t msize; 293 int if_flags; 294 295 /* hardware access lock */ 296 struct mtx hw_lock; 297 volatile uint32_t hw_lock_held; 298 299 uint32_t vm_pgsize; 300 /* transmit related */ 301 uint32_t num_tx_rings; 302 qla_tx_ring_t tx_ring[MAX_TX_RINGS]; 303 304 bus_dma_tag_t tx_tag; 305 struct task tx_task; 306 struct taskqueue *tx_tq; 307 struct callout tx_callout; 308 struct mtx tx_lock; 309 310 /* receive related */ 311 uint32_t num_rx_rings; 312 qla_rx_ring_t rx_ring[MAX_RX_RINGS]; 313 bus_dma_tag_t rx_tag; 314 315 /* stats */ 316 uint32_t err_m_getcl; 317 uint32_t err_m_getjcl; 318 uint32_t err_tx_dmamap_create; 319 uint32_t err_tx_dmamap_load; 320 uint32_t err_tx_defrag; 321 322 /* mac address related */ 323 uint8_t mac_rcv_mode; 324 uint8_t mac_addr[ETHER_ADDR_LEN]; 325 uint32_t nmcast; 326 qla_mcast_t mcast[Q8_MAX_NUM_MULTICAST_ADDRS]; 327 328 /* Link Related */ 329 uint8_t link_up; 330 uint32_t link_status; 331 uint32_t link_down_info; 332 uint32_t link_hw_info; 333 uint32_t link_dcbx_counters; 334 uint32_t link_change_counters; 335 336 /* Flash Related */ 337 q81_flash_t flash; 338 339 /* debug stuff */ 340 volatile const char *qla_lock; 341 volatile const char *qla_unlock; 342 343 /* Error Recovery Related */ 344 uint32_t err_inject; 345 struct task err_task; 346 struct taskqueue *err_tq; 347 348 /* Chip related */ 349 uint32_t rev_id; 350 351 /* mailbox completions */ 352 uint32_t aen[Q81_NUM_AEN_REGISTERS]; 353 uint32_t mbox[Q81_NUM_MBX_REGISTERS]; 354 volatile uint32_t mbx_done; 355 356 /* mpi dump related */ 357 qla_dma_t mpi_dma; 358 qla_dma_t rss_dma; 359 360 }; 361 typedef struct qla_host qla_host_t; 362 363 /* note that align has to be a power of 2 */ 364 #define QL_ALIGN(size, align) (size + (align - 1)) & ~(align - 1); 365 #define QL_MIN(x, y) ((x < y) ? x : y) 366 367 #define QL_RUNNING(ifp) \ 368 ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) == \ 369 IFF_DRV_RUNNING) 370 371 /* Return 0, if identical, else 1 */ 372 373 #define QL_MAC_CMP(mac1, mac2) \ 374 ((((*(uint32_t *) mac1) == (*(uint32_t *) mac2) && \ 375 (*(uint16_t *)(mac1 + 4)) == (*(uint16_t *)(mac2 + 4)))) ? 0 : 1) 376 377 #endif /* #ifndef _QLS_DEF_H_ */ 378