1252206Sdavidcs/* 2252206Sdavidcs * Copyright (c) 2013-2014 Qlogic Corporation 3252206Sdavidcs * All rights reserved. 4252206Sdavidcs * 5252206Sdavidcs * Redistribution and use in source and binary forms, with or without 6252206Sdavidcs * modification, are permitted provided that the following conditions 7252206Sdavidcs * are met: 8252206Sdavidcs * 9252206Sdavidcs * 1. Redistributions of source code must retain the above copyright 10252206Sdavidcs * notice, this list of conditions and the following disclaimer. 11252206Sdavidcs * 2. Redistributions in binary form must reproduce the above copyright 12252206Sdavidcs * notice, this list of conditions and the following disclaimer in the 13252206Sdavidcs * documentation and/or other materials provided with the distribution. 14252206Sdavidcs * 15252206Sdavidcs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16252206Sdavidcs * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17252206Sdavidcs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18252206Sdavidcs * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19252206Sdavidcs * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20252206Sdavidcs * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21252206Sdavidcs * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22252206Sdavidcs * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23252206Sdavidcs * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24252206Sdavidcs * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25252206Sdavidcs * POSSIBILITY OF SUCH DAMAGE. 26252206Sdavidcs * 27252206Sdavidcs * $FreeBSD$ 28252206Sdavidcs */ 29252206Sdavidcs 30252206Sdavidcs/* 31252206Sdavidcs * File: qls_def.h 32252206Sdavidcs * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656. 33252206Sdavidcs */ 34252206Sdavidcs 35252206Sdavidcs#ifndef _QLS_DEF_H_ 36252206Sdavidcs#define _QLS_DEF_H_ 37252206Sdavidcs 38252206Sdavidcs/* 39252206Sdavidcs * structure encapsulating a DMA buffer 40252206Sdavidcs */ 41252206Sdavidcsstruct qla_dma { 42252206Sdavidcs bus_size_t alignment; 43252206Sdavidcs uint32_t size; 44252206Sdavidcs void *dma_b; 45252206Sdavidcs bus_addr_t dma_addr; 46252206Sdavidcs bus_dmamap_t dma_map; 47252206Sdavidcs bus_dma_tag_t dma_tag; 48252206Sdavidcs}; 49252206Sdavidcstypedef struct qla_dma qla_dma_t; 50252206Sdavidcs 51252206Sdavidcs/* 52252206Sdavidcs * structure encapsulating interrupt vectors 53252206Sdavidcs */ 54252206Sdavidcsstruct qla_ivec { 55252206Sdavidcs uint32_t cq_idx; 56252206Sdavidcs void *ha; 57252206Sdavidcs struct resource *irq; 58252206Sdavidcs void *handle; 59252206Sdavidcs int irq_rid; 60252206Sdavidcs}; 61252206Sdavidcstypedef struct qla_ivec qla_ivec_t; 62252206Sdavidcs 63252206Sdavidcs/* 64252206Sdavidcs * Transmit Related Definitions 65252206Sdavidcs */ 66252206Sdavidcs 67252206Sdavidcs#define MAX_TX_RINGS 1 68252206Sdavidcs#define NUM_TX_DESCRIPTORS 1024 69252206Sdavidcs 70252206Sdavidcs#define QLA_MAX_SEGMENTS 64 /* maximum # of segs in a sg list */ 71252206Sdavidcs#define QLA_OAL_BLK_SIZE (sizeof (q81_txb_desc_t) * QLA_MAX_SEGMENTS) 72252206Sdavidcs 73252206Sdavidcs#define QLA_TX_OALB_TOTAL_SIZE (NUM_TX_DESCRIPTORS * QLA_OAL_BLK_SIZE) 74252206Sdavidcs 75252206Sdavidcs#define QLA_TX_PRIVATE_BSIZE ((QLA_TX_OALB_TOTAL_SIZE + \ 76252206Sdavidcs PAGE_SIZE + \ 77252206Sdavidcs (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1)) 78252206Sdavidcs 79252206Sdavidcs#define QLA_MAX_MTU 9000 80252206Sdavidcs#define QLA_STD_FRAME_SIZE 1514 81252206Sdavidcs#define QLA_MAX_TSO_FRAME_SIZE ((64 * 1024 - 1) + 22) 82252206Sdavidcs 83252206Sdavidcs#define QL_FRAME_HDR_SIZE (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN +\ 84252206Sdavidcs sizeof (struct ip6_hdr) + sizeof (struct tcphdr) + 16) 85252206Sdavidcs 86252206Sdavidcsstruct qla_tx_buf { 87252206Sdavidcs struct mbuf *m_head; 88252206Sdavidcs bus_dmamap_t map; 89252206Sdavidcs 90252206Sdavidcs /* The number of entries in the OAL is determined by QLA_MAX_SEGMENTS */ 91252206Sdavidcs bus_addr_t oal_paddr; 92252206Sdavidcs void *oal_vaddr; 93252206Sdavidcs}; 94252206Sdavidcstypedef struct qla_tx_buf qla_tx_buf_t; 95252206Sdavidcs 96252206Sdavidcsstruct qla_tx_ring { 97252206Sdavidcs 98252206Sdavidcs volatile struct { 99252206Sdavidcs uint32_t wq_dma:1, 100252206Sdavidcs privb_dma:1; 101252206Sdavidcs } flags; 102252206Sdavidcs 103252206Sdavidcs qla_dma_t privb_dma; 104252206Sdavidcs qla_dma_t wq_dma; 105252206Sdavidcs 106252206Sdavidcs qla_tx_buf_t tx_buf[NUM_TX_DESCRIPTORS]; 107252206Sdavidcs uint64_t count; 108252206Sdavidcs 109252206Sdavidcs struct resource *wq_db_addr; 110252206Sdavidcs uint32_t wq_db_offset; 111252206Sdavidcs 112252206Sdavidcs q81_tx_cmd_t *wq_vaddr; 113252206Sdavidcs bus_addr_t wq_paddr; 114252206Sdavidcs 115252206Sdavidcs void *wq_icb_vaddr; 116252206Sdavidcs bus_addr_t wq_icb_paddr; 117252206Sdavidcs 118252206Sdavidcs uint32_t *txr_cons_vaddr; 119252206Sdavidcs bus_addr_t txr_cons_paddr; 120252206Sdavidcs 121252206Sdavidcs volatile uint32_t txr_free; /* # of free entries in tx ring */ 122252206Sdavidcs volatile uint32_t txr_next; /* # next available tx ring entry */ 123252206Sdavidcs volatile uint32_t txr_done; 124252206Sdavidcs 125252206Sdavidcs uint64_t tx_frames; 126252206Sdavidcs uint64_t tx_tso_frames; 127252206Sdavidcs uint64_t tx_vlan_frames; 128252206Sdavidcs}; 129252206Sdavidcstypedef struct qla_tx_ring qla_tx_ring_t; 130252206Sdavidcs 131252206Sdavidcs/* 132252206Sdavidcs * Receive Related Definitions 133252206Sdavidcs */ 134252206Sdavidcs 135252206Sdavidcs#define MAX_RX_RINGS MAX_TX_RINGS 136252206Sdavidcs 137252206Sdavidcs#define NUM_RX_DESCRIPTORS 1024 138252206Sdavidcs#define NUM_CQ_ENTRIES NUM_RX_DESCRIPTORS 139252206Sdavidcs 140252206Sdavidcs#define QLA_LGB_SIZE (12 * 1024) 141252206Sdavidcs#define QLA_NUM_LGB_ENTRIES 32 142252206Sdavidcs 143252206Sdavidcs#define QLA_LBQ_SIZE (QLA_NUM_LGB_ENTRIES * sizeof(q81_bq_addr_e_t)) 144252206Sdavidcs 145252206Sdavidcs#define QLA_LGBQ_AND_TABLE_SIZE \ 146252206Sdavidcs ((QLA_LBQ_SIZE + PAGE_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1)) 147252206Sdavidcs 148252206Sdavidcs 149252206Sdavidcs/* Please note that Small Buffer size is determined by max mtu size */ 150252206Sdavidcs#define QLA_NUM_SMB_ENTRIES NUM_RX_DESCRIPTORS 151252206Sdavidcs 152252206Sdavidcs#define QLA_SBQ_SIZE (QLA_NUM_SMB_ENTRIES * sizeof(q81_bq_addr_e_t)) 153252206Sdavidcs 154252206Sdavidcs#define QLA_SMBQ_AND_TABLE_SIZE \ 155252206Sdavidcs ((QLA_SBQ_SIZE + PAGE_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1)) 156252206Sdavidcs 157252206Sdavidcsstruct qla_rx_buf { 158252206Sdavidcs struct mbuf *m_head; 159252206Sdavidcs bus_dmamap_t map; 160252206Sdavidcs bus_addr_t paddr; 161252206Sdavidcs void *next; 162252206Sdavidcs}; 163252206Sdavidcstypedef struct qla_rx_buf qla_rx_buf_t; 164252206Sdavidcs 165252206Sdavidcsstruct qla_rx_ring { 166252206Sdavidcs volatile struct { 167252206Sdavidcs uint32_t cq_dma:1, 168252206Sdavidcs lbq_dma:1, 169252206Sdavidcs sbq_dma:1, 170252206Sdavidcs lb_dma:1; 171252206Sdavidcs } flags; 172252206Sdavidcs 173252206Sdavidcs qla_dma_t cq_dma; 174252206Sdavidcs qla_dma_t lbq_dma; 175252206Sdavidcs qla_dma_t sbq_dma; 176252206Sdavidcs qla_dma_t lb_dma; 177252206Sdavidcs 178252206Sdavidcs struct lro_ctrl lro; 179252206Sdavidcs 180252206Sdavidcs qla_rx_buf_t rx_buf[NUM_RX_DESCRIPTORS]; 181252206Sdavidcs qla_rx_buf_t *rxb_free; 182252206Sdavidcs uint32_t rx_free; 183252206Sdavidcs uint32_t rx_next; 184252206Sdavidcs 185252206Sdavidcs uint32_t cq_db_offset; 186252206Sdavidcs 187252206Sdavidcs void *cq_icb_vaddr; 188252206Sdavidcs bus_addr_t cq_icb_paddr; 189252206Sdavidcs 190252206Sdavidcs uint32_t *cqi_vaddr; 191252206Sdavidcs bus_addr_t cqi_paddr; 192252206Sdavidcs 193252206Sdavidcs void *cq_base_vaddr; 194252206Sdavidcs bus_addr_t cq_base_paddr; 195252206Sdavidcs uint32_t cq_next; /* next cq entry to process */ 196252206Sdavidcs 197252206Sdavidcs void *lbq_addr_tbl_vaddr; 198252206Sdavidcs bus_addr_t lbq_addr_tbl_paddr; 199252206Sdavidcs 200252206Sdavidcs void *lbq_vaddr; 201252206Sdavidcs bus_addr_t lbq_paddr; 202252206Sdavidcs uint32_t lbq_next; /* next entry in LBQ to process */ 203252206Sdavidcs uint32_t lbq_free;/* # of entries in LBQ to arm */ 204252206Sdavidcs uint32_t lbq_in; /* next entry in LBQ to arm */ 205252206Sdavidcs 206252206Sdavidcs void *lb_vaddr; 207252206Sdavidcs bus_addr_t lb_paddr; 208252206Sdavidcs 209252206Sdavidcs void *sbq_addr_tbl_vaddr; 210252206Sdavidcs bus_addr_t sbq_addr_tbl_paddr; 211252206Sdavidcs 212252206Sdavidcs void *sbq_vaddr; 213252206Sdavidcs bus_addr_t sbq_paddr; 214252206Sdavidcs uint32_t sbq_next; /* next entry in SBQ to process */ 215252206Sdavidcs uint32_t sbq_free;/* # of entries in SBQ to arm */ 216252206Sdavidcs uint32_t sbq_in; /* next entry in SBQ to arm */ 217252206Sdavidcs 218252206Sdavidcs uint64_t rx_int; 219252206Sdavidcs uint64_t rss_int; 220252206Sdavidcs}; 221252206Sdavidcstypedef struct qla_rx_ring qla_rx_ring_t; 222252206Sdavidcs 223252206Sdavidcs 224252206Sdavidcs#define QLA_WATCHDOG_CALLOUT_TICKS 1 225252206Sdavidcs 226252206Sdavidcs/* 227252206Sdavidcs * Multicast Definitions 228252206Sdavidcs */ 229252206Sdavidcstypedef struct _qla_mcast { 230252206Sdavidcs uint16_t rsrvd; 231252206Sdavidcs uint8_t addr[6]; 232252206Sdavidcs} __packed qla_mcast_t; 233252206Sdavidcs 234252206Sdavidcs/* 235252206Sdavidcs * Misc. definitions 236252206Sdavidcs */ 237252206Sdavidcs#define QLA_PAGE_SIZE 4096 238252206Sdavidcs 239252206Sdavidcs/* 240252206Sdavidcs * Adapter structure contains the hardware independant information of the 241252206Sdavidcs * pci function. 242252206Sdavidcs */ 243252206Sdavidcsstruct qla_host { 244252206Sdavidcs volatile struct { 245252206Sdavidcs volatile uint32_t 246252206Sdavidcs mpi_dma :1, 247252206Sdavidcs rss_dma :1, 248252206Sdavidcs intr_enable :1, 249252206Sdavidcs qla_callout_init :1, 250252206Sdavidcs qla_watchdog_active :1, 251252206Sdavidcs qla_watchdog_exit :1, 252252206Sdavidcs qla_watchdog_pause :1, 253252206Sdavidcs lro_init :1, 254252206Sdavidcs parent_tag :1, 255252206Sdavidcs lock_init :1; 256252206Sdavidcs } flags; 257252206Sdavidcs 258252206Sdavidcs volatile uint32_t hw_init; 259252206Sdavidcs 260252206Sdavidcs volatile uint32_t qla_watchdog_exited; 261252206Sdavidcs volatile uint32_t qla_watchdog_paused; 262252206Sdavidcs volatile uint32_t qla_initiate_recovery; 263252206Sdavidcs 264252206Sdavidcs device_t pci_dev; 265252206Sdavidcs 266252206Sdavidcs uint8_t pci_func; 267252206Sdavidcs uint16_t watchdog_ticks; 268252206Sdavidcs uint8_t resvd; 269252206Sdavidcs 270252206Sdavidcs /* ioctl related */ 271252206Sdavidcs struct cdev *ioctl_dev; 272252206Sdavidcs 273252206Sdavidcs /* register mapping */ 274252206Sdavidcs struct resource *pci_reg; 275252206Sdavidcs int reg_rid; 276252206Sdavidcs 277252206Sdavidcs struct resource *pci_reg1; 278252206Sdavidcs int reg_rid1; 279252206Sdavidcs 280252206Sdavidcs int msix_count; 281252206Sdavidcs qla_ivec_t irq_vec[MAX_RX_RINGS]; 282252206Sdavidcs 283252206Sdavidcs /* parent dma tag */ 284252206Sdavidcs bus_dma_tag_t parent_tag; 285252206Sdavidcs 286252206Sdavidcs /* interface to o.s */ 287252206Sdavidcs struct ifnet *ifp; 288252206Sdavidcs 289252206Sdavidcs struct ifmedia media; 290252206Sdavidcs uint16_t max_frame_size; 291252206Sdavidcs uint16_t rsrvd0; 292252206Sdavidcs uint32_t msize; 293252206Sdavidcs int if_flags; 294252206Sdavidcs 295252206Sdavidcs /* hardware access lock */ 296252206Sdavidcs struct mtx hw_lock; 297252206Sdavidcs volatile uint32_t hw_lock_held; 298252206Sdavidcs 299252206Sdavidcs uint32_t vm_pgsize; 300252206Sdavidcs /* transmit related */ 301252206Sdavidcs uint32_t num_tx_rings; 302252206Sdavidcs qla_tx_ring_t tx_ring[MAX_TX_RINGS]; 303252206Sdavidcs 304252206Sdavidcs bus_dma_tag_t tx_tag; 305252206Sdavidcs struct task tx_task; 306252206Sdavidcs struct taskqueue *tx_tq; 307252206Sdavidcs struct callout tx_callout; 308252206Sdavidcs struct mtx tx_lock; 309252206Sdavidcs 310252206Sdavidcs /* receive related */ 311252206Sdavidcs uint32_t num_rx_rings; 312252206Sdavidcs qla_rx_ring_t rx_ring[MAX_RX_RINGS]; 313252206Sdavidcs bus_dma_tag_t rx_tag; 314252206Sdavidcs 315252206Sdavidcs /* stats */ 316252206Sdavidcs uint32_t err_m_getcl; 317252206Sdavidcs uint32_t err_m_getjcl; 318252206Sdavidcs uint32_t err_tx_dmamap_create; 319252206Sdavidcs uint32_t err_tx_dmamap_load; 320252206Sdavidcs uint32_t err_tx_defrag; 321252206Sdavidcs 322252206Sdavidcs /* mac address related */ 323252206Sdavidcs uint8_t mac_rcv_mode; 324252206Sdavidcs uint8_t mac_addr[ETHER_ADDR_LEN]; 325252206Sdavidcs uint32_t nmcast; 326252206Sdavidcs qla_mcast_t mcast[Q8_MAX_NUM_MULTICAST_ADDRS]; 327252206Sdavidcs 328252206Sdavidcs /* Link Related */ 329252206Sdavidcs uint8_t link_up; 330252206Sdavidcs uint32_t link_status; 331252206Sdavidcs uint32_t link_down_info; 332252206Sdavidcs uint32_t link_hw_info; 333252206Sdavidcs uint32_t link_dcbx_counters; 334252206Sdavidcs uint32_t link_change_counters; 335252206Sdavidcs 336252206Sdavidcs /* Flash Related */ 337252206Sdavidcs q81_flash_t flash; 338252206Sdavidcs 339252206Sdavidcs /* debug stuff */ 340252206Sdavidcs volatile const char *qla_lock; 341252206Sdavidcs volatile const char *qla_unlock; 342252206Sdavidcs 343252206Sdavidcs /* Error Recovery Related */ 344252206Sdavidcs uint32_t err_inject; 345252206Sdavidcs struct task err_task; 346252206Sdavidcs struct taskqueue *err_tq; 347252206Sdavidcs 348252206Sdavidcs /* Chip related */ 349252206Sdavidcs uint32_t rev_id; 350252206Sdavidcs 351252206Sdavidcs /* mailbox completions */ 352252206Sdavidcs uint32_t aen[Q81_NUM_AEN_REGISTERS]; 353252206Sdavidcs uint32_t mbox[Q81_NUM_MBX_REGISTERS]; 354252206Sdavidcs volatile uint32_t mbx_done; 355252206Sdavidcs 356252206Sdavidcs /* mpi dump related */ 357252206Sdavidcs qla_dma_t mpi_dma; 358252206Sdavidcs qla_dma_t rss_dma; 359252206Sdavidcs 360252206Sdavidcs}; 361252206Sdavidcstypedef struct qla_host qla_host_t; 362252206Sdavidcs 363252206Sdavidcs/* note that align has to be a power of 2 */ 364252206Sdavidcs#define QL_ALIGN(size, align) (size + (align - 1)) & ~(align - 1); 365252206Sdavidcs#define QL_MIN(x, y) ((x < y) ? x : y) 366252206Sdavidcs 367252206Sdavidcs#define QL_RUNNING(ifp) \ 368252206Sdavidcs ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) == \ 369252206Sdavidcs IFF_DRV_RUNNING) 370252206Sdavidcs 371252206Sdavidcs/* Return 0, if identical, else 1 */ 372252206Sdavidcs 373252206Sdavidcs#define QL_MAC_CMP(mac1, mac2) \ 374252206Sdavidcs ((((*(uint32_t *) mac1) == (*(uint32_t *) mac2) && \ 375252206Sdavidcs (*(uint16_t *)(mac1 + 4)) == (*(uint16_t *)(mac2 + 4)))) ? 0 : 1) 376252206Sdavidcs 377252206Sdavidcs#endif /* #ifndef _QLS_DEF_H_ */ 378