1718cf2ccSPedro F. Giffuni /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3718cf2ccSPedro F. Giffuni * 4088fc971SDavid C Somayajulu * Copyright (c) 2011-2013 Qlogic Corporation 50bc7cf6fSBjoern A. Zeeb * All rights reserved. 60bc7cf6fSBjoern A. Zeeb * 70bc7cf6fSBjoern A. Zeeb * Redistribution and use in source and binary forms, with or without 80bc7cf6fSBjoern A. Zeeb * modification, are permitted provided that the following conditions 90bc7cf6fSBjoern A. Zeeb * are met: 100bc7cf6fSBjoern A. Zeeb * 110bc7cf6fSBjoern A. Zeeb * 1. Redistributions of source code must retain the above copyright 120bc7cf6fSBjoern A. Zeeb * notice, this list of conditions and the following disclaimer. 130bc7cf6fSBjoern A. Zeeb * 2. Redistributions in binary form must reproduce the above copyright 140bc7cf6fSBjoern A. Zeeb * notice, this list of conditions and the following disclaimer in the 150bc7cf6fSBjoern A. Zeeb * documentation and/or other materials provided with the distribution. 160bc7cf6fSBjoern A. Zeeb * 170bc7cf6fSBjoern A. Zeeb * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 180bc7cf6fSBjoern A. Zeeb * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 190bc7cf6fSBjoern A. Zeeb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 200bc7cf6fSBjoern A. Zeeb * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 210bc7cf6fSBjoern A. Zeeb * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 220bc7cf6fSBjoern A. Zeeb * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 230bc7cf6fSBjoern A. Zeeb * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 240bc7cf6fSBjoern A. Zeeb * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 250bc7cf6fSBjoern A. Zeeb * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 260bc7cf6fSBjoern A. Zeeb * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 270bc7cf6fSBjoern A. Zeeb * POSSIBILITY OF SUCH DAMAGE. 280bc7cf6fSBjoern A. Zeeb */ 290bc7cf6fSBjoern A. Zeeb /* 300bc7cf6fSBjoern A. Zeeb * File: qla_hw.h 310bc7cf6fSBjoern A. Zeeb * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656. 320bc7cf6fSBjoern A. Zeeb */ 330bc7cf6fSBjoern A. Zeeb #ifndef _QLA_HW_H_ 340bc7cf6fSBjoern A. Zeeb #define _QLA_HW_H_ 350bc7cf6fSBjoern A. Zeeb 360bc7cf6fSBjoern A. Zeeb #define Q8_MAX_NUM_MULTICAST_ADDRS 128 370bc7cf6fSBjoern A. Zeeb #define Q8_MAC_ADDR_LEN 6 380bc7cf6fSBjoern A. Zeeb 390bc7cf6fSBjoern A. Zeeb /* 400bc7cf6fSBjoern A. Zeeb * Firmware Interface 410bc7cf6fSBjoern A. Zeeb */ 420bc7cf6fSBjoern A. Zeeb 430bc7cf6fSBjoern A. Zeeb /* 440bc7cf6fSBjoern A. Zeeb * Command Response Interface - Commands 450bc7cf6fSBjoern A. Zeeb */ 460bc7cf6fSBjoern A. Zeeb typedef struct qla_cdrp { 470bc7cf6fSBjoern A. Zeeb uint32_t cmd; 480bc7cf6fSBjoern A. Zeeb uint32_t cmd_arg1; 490bc7cf6fSBjoern A. Zeeb uint32_t cmd_arg2; 500bc7cf6fSBjoern A. Zeeb uint32_t cmd_arg3; 510bc7cf6fSBjoern A. Zeeb uint32_t rsp; 520bc7cf6fSBjoern A. Zeeb uint32_t rsp_arg1; 530bc7cf6fSBjoern A. Zeeb uint32_t rsp_arg2; 540bc7cf6fSBjoern A. Zeeb uint32_t rsp_arg3; 550bc7cf6fSBjoern A. Zeeb } qla_cdrp_t; 560bc7cf6fSBjoern A. Zeeb 570bc7cf6fSBjoern A. Zeeb #define Q8_CMD_RD_MAX_RDS_PER_CNTXT 0x80000002 580bc7cf6fSBjoern A. Zeeb #define Q8_CMD_RD_MAX_SDS_PER_CNTXT 0x80000003 590bc7cf6fSBjoern A. Zeeb #define Q8_CMD_RD_MAX_RULES_PER_CNTXT 0x80000004 600bc7cf6fSBjoern A. Zeeb #define Q8_CMD_RD_MAX_RX_CNTXT 0x80000005 610bc7cf6fSBjoern A. Zeeb #define Q8_CMD_RD_MAX_TX_CNTXT 0x80000006 620bc7cf6fSBjoern A. Zeeb #define Q8_CMD_CREATE_RX_CNTXT 0x80000007 630bc7cf6fSBjoern A. Zeeb #define Q8_CMD_DESTROY_RX_CNTXT 0x80000008 640bc7cf6fSBjoern A. Zeeb #define Q8_CMD_CREATE_TX_CNTXT 0x80000009 650bc7cf6fSBjoern A. Zeeb #define Q8_CMD_DESTROY_TX_CNTXT 0x8000000A 660bc7cf6fSBjoern A. Zeeb #define Q8_CMD_SETUP_STATS 0x8000000E 670bc7cf6fSBjoern A. Zeeb #define Q8_CMD_GET_STATS 0x8000000F 680bc7cf6fSBjoern A. Zeeb #define Q8_CMD_DELETE_STATS 0x80000010 690bc7cf6fSBjoern A. Zeeb #define Q8_CMD_GEN_INT 0x80000011 700bc7cf6fSBjoern A. Zeeb #define Q8_CMD_SET_MTU 0x80000012 710bc7cf6fSBjoern A. Zeeb #define Q8_CMD_GET_FLOW_CNTRL 0x80000016 720bc7cf6fSBjoern A. Zeeb #define Q8_CMD_SET_FLOW_CNTRL 0x80000017 730bc7cf6fSBjoern A. Zeeb #define Q8_CMD_RD_MAX_MTU 0x80000018 740bc7cf6fSBjoern A. Zeeb #define Q8_CMD_RD_MAX_LRO 0x80000019 750bc7cf6fSBjoern A. Zeeb 760bc7cf6fSBjoern A. Zeeb /* 770bc7cf6fSBjoern A. Zeeb * Command Response Interface - Response 780bc7cf6fSBjoern A. Zeeb */ 790bc7cf6fSBjoern A. Zeeb #define Q8_RSP_SUCCESS 0x00000000 800bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NO_HOST_MEM 0x00000001 810bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NO_HOST_RSRC 0x00000002 820bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NO_CARD_CRB 0x00000003 830bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NO_CARD_MEM 0x00000004 840bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NO_CARD_RSRC 0x00000005 850bc7cf6fSBjoern A. Zeeb #define Q8_RSP_INVALID_ARGS 0x00000006 860bc7cf6fSBjoern A. Zeeb #define Q8_RSP_INVALID_ACTION 0x00000007 870bc7cf6fSBjoern A. Zeeb #define Q8_RSP_INVALID_STATE 0x00000008 880bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NOT_SUPPORTED 0x00000009 890bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NOT_PERMITTED 0x0000000A 900bc7cf6fSBjoern A. Zeeb #define Q8_RSP_NOT_READY 0x0000000B 910bc7cf6fSBjoern A. Zeeb #define Q8_RSP_DOES_NOT_EXIST 0x0000000C 920bc7cf6fSBjoern A. Zeeb #define Q8_RSP_ALREADY_EXISTS 0x0000000D 930bc7cf6fSBjoern A. Zeeb #define Q8_RSP_BAD_SIGNATURE 0x0000000E 940bc7cf6fSBjoern A. Zeeb #define Q8_RSP_CMD_NOT_IMPLEMENTED 0x0000000F 950bc7cf6fSBjoern A. Zeeb #define Q8_RSP_CMD_INVALID 0x00000010 960bc7cf6fSBjoern A. Zeeb #define Q8_RSP_TIMEOUT 0x00000011 970bc7cf6fSBjoern A. Zeeb 980bc7cf6fSBjoern A. Zeeb /* 990bc7cf6fSBjoern A. Zeeb * Transmit Related Definitions 1000bc7cf6fSBjoern A. Zeeb */ 1010bc7cf6fSBjoern A. Zeeb 1020bc7cf6fSBjoern A. Zeeb /* 1030bc7cf6fSBjoern A. Zeeb * Transmit Context - Q8_CMD_CREATE_TX_CNTXT Command Configuration Data 1040bc7cf6fSBjoern A. Zeeb */ 1050bc7cf6fSBjoern A. Zeeb 1060bc7cf6fSBjoern A. Zeeb typedef struct _q80_tx_cntxt_req { 1070bc7cf6fSBjoern A. Zeeb uint64_t rsp_dma_addr; /* rsp from firmware is DMA'ed here */ 1080bc7cf6fSBjoern A. Zeeb uint64_t cmd_cons_dma_addr; 1090bc7cf6fSBjoern A. Zeeb uint64_t rsrvd0; 1100bc7cf6fSBjoern A. Zeeb 1110bc7cf6fSBjoern A. Zeeb uint32_t caps[4]; /* capabilities - bit vector*/ 1120bc7cf6fSBjoern A. Zeeb #define CNTXT_CAP0_BASEFW 0x0001 1130bc7cf6fSBjoern A. Zeeb #define CNTXT_CAP0_LEGACY_MN 0x0004 1140bc7cf6fSBjoern A. Zeeb #define CNTXT_CAP0_LSO 0x0040 1150bc7cf6fSBjoern A. Zeeb 1160bc7cf6fSBjoern A. Zeeb uint32_t intr_mode; /* Interrupt Mode */ 1170bc7cf6fSBjoern A. Zeeb #define CNTXT_INTR_MODE_UNIQUE 0x0000 1180bc7cf6fSBjoern A. Zeeb #define CNTXT_INTR_MODE_SHARED 0x0001 1190bc7cf6fSBjoern A. Zeeb 1200bc7cf6fSBjoern A. Zeeb uint64_t rsrvd1; 1210bc7cf6fSBjoern A. Zeeb uint16_t msi_index; 1220bc7cf6fSBjoern A. Zeeb uint16_t rsrvd2; 1230bc7cf6fSBjoern A. Zeeb uint64_t phys_addr; /* physical address of transmit ring 1240bc7cf6fSBjoern A. Zeeb * in system memory */ 1250bc7cf6fSBjoern A. Zeeb uint32_t num_entries; /* number of entries in transmit ring */ 1260bc7cf6fSBjoern A. Zeeb uint8_t rsrvd3[128]; 1270bc7cf6fSBjoern A. Zeeb } __packed q80_tx_cntxt_req_t; /* 188 bytes total */ 1280bc7cf6fSBjoern A. Zeeb 1290bc7cf6fSBjoern A. Zeeb /* 1300bc7cf6fSBjoern A. Zeeb * Transmit Context - Response from Firmware to Q8_CMD_CREATE_TX_CNTXT 1310bc7cf6fSBjoern A. Zeeb */ 1320bc7cf6fSBjoern A. Zeeb 1330bc7cf6fSBjoern A. Zeeb typedef struct _q80_tx_cntxt_rsp { 1340bc7cf6fSBjoern A. Zeeb uint32_t cntxt_state; /* starting state */ 1350bc7cf6fSBjoern A. Zeeb #define CNTXT_STATE_ALLOCATED_NOT_ACTIVE 0x0001 1360bc7cf6fSBjoern A. Zeeb #define CNTXT_STATE_ACTIVE 0x0002 1370bc7cf6fSBjoern A. Zeeb #define CNTXT_STATE_QUIESCED 0x0004 1380bc7cf6fSBjoern A. Zeeb 1390bc7cf6fSBjoern A. Zeeb uint16_t cntxt_id; /* handle for context */ 1400bc7cf6fSBjoern A. Zeeb uint8_t phys_port_id; /* physical id of port */ 1410bc7cf6fSBjoern A. Zeeb uint8_t virt_port_id; /* virtual or logical id of port */ 1420bc7cf6fSBjoern A. Zeeb uint32_t producer_reg; /* producer register for transmit ring */ 1430bc7cf6fSBjoern A. Zeeb uint32_t intr_mask_reg; /* interrupt mask register */ 1440bc7cf6fSBjoern A. Zeeb uint8_t rsrvd[128]; 1450bc7cf6fSBjoern A. Zeeb } __packed q80_tx_cntxt_rsp_t; /* 144 bytes */ 1460bc7cf6fSBjoern A. Zeeb 1470bc7cf6fSBjoern A. Zeeb /* 1480bc7cf6fSBjoern A. Zeeb * Transmit Command Descriptor 1490bc7cf6fSBjoern A. Zeeb * These commands are issued on the Transmit Ring associated with a Transmit 1500bc7cf6fSBjoern A. Zeeb * context 1510bc7cf6fSBjoern A. Zeeb */ 1520bc7cf6fSBjoern A. Zeeb typedef struct _q80_tx_cmd { 1530bc7cf6fSBjoern A. Zeeb uint8_t tcp_hdr_off; /* TCP Header Offset */ 1540bc7cf6fSBjoern A. Zeeb uint8_t ip_hdr_off; /* IP Header Offset */ 1550bc7cf6fSBjoern A. Zeeb uint16_t flags_opcode; /* Bits 0-6: flags; 7-12: opcode */ 1560bc7cf6fSBjoern A. Zeeb 1570bc7cf6fSBjoern A. Zeeb /* flags field */ 1580bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_FLAGS_MULTICAST 0x01 1590bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_FLAGS_LSO_TSO 0x02 1600bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_FLAGS_VLAN_TAGGED 0x10 1610bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_FLAGS_HW_VLAN_ID 0x40 1620bc7cf6fSBjoern A. Zeeb 1630bc7cf6fSBjoern A. Zeeb /* opcode field */ 1640bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_OP_XMT_UDP_CHKSUM_IPV6 (0xC << 7) 1650bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_OP_XMT_TCP_CHKSUM_IPV6 (0xB << 7) 1660bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_OP_XMT_TCP_LSO_IPV6 (0x6 << 7) 1670bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_OP_XMT_TCP_LSO (0x5 << 7) 1680bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_OP_XMT_UDP_CHKSUM (0x3 << 7) 1690bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_OP_XMT_TCP_CHKSUM (0x2 << 7) 1700bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_OP_XMT_ETHER (0x1 << 7) 1710bc7cf6fSBjoern A. Zeeb 1720bc7cf6fSBjoern A. Zeeb uint8_t n_bufs; /* # of data segs in data buffer */ 1730bc7cf6fSBjoern A. Zeeb uint8_t data_len_lo; /* data length lower 8 bits */ 1740bc7cf6fSBjoern A. Zeeb uint16_t data_len_hi; /* data length upper 16 bits */ 1750bc7cf6fSBjoern A. Zeeb 1760bc7cf6fSBjoern A. Zeeb uint64_t buf2_addr; /* buffer 2 address */ 1770bc7cf6fSBjoern A. Zeeb 1780bc7cf6fSBjoern A. Zeeb uint16_t rsrvd0; 1790bc7cf6fSBjoern A. Zeeb uint16_t mss; /* MSS for this packet */ 1800bc7cf6fSBjoern A. Zeeb uint8_t port_cntxtid; /* Bits 7-4: ContextId; 3-0: reserved */ 1810bc7cf6fSBjoern A. Zeeb 1820bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_PORT_CNXTID(c_id) ((c_id & 0xF) << 4) 1830bc7cf6fSBjoern A. Zeeb 1840bc7cf6fSBjoern A. Zeeb uint8_t total_hdr_len; /* MAC+IP+TCP Header Length for LSO */ 1850bc7cf6fSBjoern A. Zeeb uint16_t rsrvd1; 1860bc7cf6fSBjoern A. Zeeb 1870bc7cf6fSBjoern A. Zeeb uint64_t buf3_addr; /* buffer 3 address */ 1880bc7cf6fSBjoern A. Zeeb uint64_t buf1_addr; /* buffer 1 address */ 1890bc7cf6fSBjoern A. Zeeb 1900bc7cf6fSBjoern A. Zeeb uint16_t buf1_len; /* length of buffer 1 */ 1910bc7cf6fSBjoern A. Zeeb uint16_t buf2_len; /* length of buffer 2 */ 1920bc7cf6fSBjoern A. Zeeb uint16_t buf3_len; /* length of buffer 3 */ 1930bc7cf6fSBjoern A. Zeeb uint16_t buf4_len; /* length of buffer 4 */ 1940bc7cf6fSBjoern A. Zeeb 1950bc7cf6fSBjoern A. Zeeb uint64_t buf4_addr; /* buffer 4 address */ 1960bc7cf6fSBjoern A. Zeeb 1970bc7cf6fSBjoern A. Zeeb uint32_t rsrvd2; 1980bc7cf6fSBjoern A. Zeeb uint16_t rsrvd3; 1990bc7cf6fSBjoern A. Zeeb uint16_t vlan_tci; /* VLAN TCI when hw tagging is enabled*/ 2000bc7cf6fSBjoern A. Zeeb 2010bc7cf6fSBjoern A. Zeeb } __packed q80_tx_cmd_t; /* 64 bytes */ 2020bc7cf6fSBjoern A. Zeeb 2030bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_MAX_SEGMENTS 4 2040bc7cf6fSBjoern A. Zeeb #define Q8_TX_CMD_TSO_ALIGN 2 2050bc7cf6fSBjoern A. Zeeb #define Q8_TX_MAX_SEGMENTS 14 2060bc7cf6fSBjoern A. Zeeb 2070bc7cf6fSBjoern A. Zeeb /* 2080bc7cf6fSBjoern A. Zeeb * Receive Related Definitions 2090bc7cf6fSBjoern A. Zeeb */ 2100bc7cf6fSBjoern A. Zeeb /* 2110bc7cf6fSBjoern A. Zeeb * Receive Context - Q8_CMD_CREATE_RX_CNTXT Command Configuration Data 2120bc7cf6fSBjoern A. Zeeb */ 2130bc7cf6fSBjoern A. Zeeb 2140bc7cf6fSBjoern A. Zeeb typedef struct _q80_rq_sds_ring { 2150bc7cf6fSBjoern A. Zeeb uint64_t phys_addr; /* physical addr of status ring in system memory */ 2160bc7cf6fSBjoern A. Zeeb uint32_t size; /* number of entries in status ring */ 2170bc7cf6fSBjoern A. Zeeb uint16_t msi_index; 2180bc7cf6fSBjoern A. Zeeb uint16_t rsrvd; 2190bc7cf6fSBjoern A. Zeeb } __packed q80_rq_sds_ring_t; /* 16 bytes */ 2200bc7cf6fSBjoern A. Zeeb 2210bc7cf6fSBjoern A. Zeeb typedef struct _q80_rq_rds_ring { 2220bc7cf6fSBjoern A. Zeeb uint64_t phys_addr; /* physical addr of rcv ring in system memory */ 2230bc7cf6fSBjoern A. Zeeb uint64_t buf_size; /* packet buffer size */ 2240bc7cf6fSBjoern A. Zeeb uint32_t size; /* number of entries in ring */ 2250bc7cf6fSBjoern A. Zeeb uint32_t rsrvd; 2260bc7cf6fSBjoern A. Zeeb } __packed q80_rq_rds_ring_t; /* 24 bytes */ 2270bc7cf6fSBjoern A. Zeeb 2280bc7cf6fSBjoern A. Zeeb typedef struct _q80_rq_rcv_cntxt { 2290bc7cf6fSBjoern A. Zeeb uint64_t rsp_dma_addr; /* rsp from firmware is DMA'ed here */ 2300bc7cf6fSBjoern A. Zeeb uint32_t caps[4]; /* bit vector */ 2310bc7cf6fSBjoern A. Zeeb #define CNTXT_CAP0_JUMBO 0x0080 /* Contiguous Jumbo buffers*/ 2320bc7cf6fSBjoern A. Zeeb #define CNTXT_CAP0_LRO 0x0100 2330bc7cf6fSBjoern A. Zeeb #define CNTXT_CAP0_HW_LRO 0x0800 /* HW LRO */ 2340bc7cf6fSBjoern A. Zeeb 2350bc7cf6fSBjoern A. Zeeb uint32_t intr_mode; /* same as q80_tx_cntxt_req_t */ 2360bc7cf6fSBjoern A. Zeeb uint32_t rds_intr_mode; /* same as q80_tx_cntxt_req_t */ 2370bc7cf6fSBjoern A. Zeeb 2380bc7cf6fSBjoern A. Zeeb uint32_t rds_ring_offset; /* rds configuration relative to data[0] */ 2390bc7cf6fSBjoern A. Zeeb uint32_t sds_ring_offset; /* sds configuration relative to data[0] */ 2400bc7cf6fSBjoern A. Zeeb 2410bc7cf6fSBjoern A. Zeeb uint16_t num_rds_rings; 2420bc7cf6fSBjoern A. Zeeb uint16_t num_sds_rings; 2430bc7cf6fSBjoern A. Zeeb 2440bc7cf6fSBjoern A. Zeeb uint8_t rsrvd1[132]; 2450bc7cf6fSBjoern A. Zeeb } __packed q80_rq_rcv_cntxt_t; /* 176 bytes header + rds + sds ring rqsts */ 2460bc7cf6fSBjoern A. Zeeb 2470bc7cf6fSBjoern A. Zeeb /* 2480bc7cf6fSBjoern A. Zeeb * Receive Context - Response from Firmware to Q8_CMD_CREATE_RX_CNTXT 2490bc7cf6fSBjoern A. Zeeb */ 2500bc7cf6fSBjoern A. Zeeb 2510bc7cf6fSBjoern A. Zeeb typedef struct _q80_rsp_rds_ring { 2520bc7cf6fSBjoern A. Zeeb uint32_t producer_reg; 2530bc7cf6fSBjoern A. Zeeb uint32_t rsrvd; 2540bc7cf6fSBjoern A. Zeeb } __packed q80_rsp_rds_ring_t; /* 8 bytes */ 2550bc7cf6fSBjoern A. Zeeb 2560bc7cf6fSBjoern A. Zeeb typedef struct _q80_rsp_sds_ring { 2570bc7cf6fSBjoern A. Zeeb uint32_t consumer_reg; 2580bc7cf6fSBjoern A. Zeeb uint32_t intr_mask_reg; 2590bc7cf6fSBjoern A. Zeeb } __packed q80_rsp_sds_ring_t; /* 8 bytes */ 2600bc7cf6fSBjoern A. Zeeb 2610bc7cf6fSBjoern A. Zeeb typedef struct _q80_rsp_rcv_cntxt { 2620bc7cf6fSBjoern A. Zeeb uint32_t rds_ring_offset; /* rds configuration relative to data[0] */ 2630bc7cf6fSBjoern A. Zeeb uint32_t sds_ring_offset; /* sds configuration relative to data[0] */ 2640bc7cf6fSBjoern A. Zeeb 2650bc7cf6fSBjoern A. Zeeb uint32_t cntxt_state; /* starting state */ 2660bc7cf6fSBjoern A. Zeeb uint32_t funcs_per_port; /* number of PCI functions sharing each port */ 2670bc7cf6fSBjoern A. Zeeb 2680bc7cf6fSBjoern A. Zeeb uint16_t num_rds_rings; 2690bc7cf6fSBjoern A. Zeeb uint16_t num_sds_rings; 2700bc7cf6fSBjoern A. Zeeb 2710bc7cf6fSBjoern A. Zeeb uint16_t cntxt_id; /* handle for context */ 2720bc7cf6fSBjoern A. Zeeb 2730bc7cf6fSBjoern A. Zeeb uint8_t phys_port; /* physical id of port */ 2740bc7cf6fSBjoern A. Zeeb uint8_t virt_port; /* virtual or logical id of port */ 2750bc7cf6fSBjoern A. Zeeb 2760bc7cf6fSBjoern A. Zeeb uint8_t rsrvd[128]; 2770bc7cf6fSBjoern A. Zeeb uint8_t data[0]; 2780bc7cf6fSBjoern A. Zeeb } __packed q80_rsp_rcv_cntxt_t; /* 152 bytes header + rds + sds ring rspncs */ 2790bc7cf6fSBjoern A. Zeeb 2800bc7cf6fSBjoern A. Zeeb /* 2810bc7cf6fSBjoern A. Zeeb * Note: 2820bc7cf6fSBjoern A. Zeeb * Transmit Context 2830bc7cf6fSBjoern A. Zeeb * 188 (rq) + 144 (rsp) = 332 bytes are required 2840bc7cf6fSBjoern A. Zeeb * 2850bc7cf6fSBjoern A. Zeeb * Receive Context 2860bc7cf6fSBjoern A. Zeeb * 1 RDS and 1 SDS rings: (16+24+176)+(8+8+152) = 384 bytes 2870bc7cf6fSBjoern A. Zeeb * 2880bc7cf6fSBjoern A. Zeeb * 3 RDS and 4 SDS rings: (((16+24)*3)+176) + (((8+8)*4)+152) = 2890bc7cf6fSBjoern A. Zeeb * = 296 + 216 = 512 bytes 2900bc7cf6fSBjoern A. Zeeb * Clearly this within the minimum PAGE size of most O.S platforms 2910bc7cf6fSBjoern A. Zeeb * (typically 4Kbytes). Hence it is simpler to simply allocate one PAGE 2920bc7cf6fSBjoern A. Zeeb * and then carve out space for each context. It is also a good idea to 2930bc7cf6fSBjoern A. Zeeb * to throw in the shadown register for the consumer index of the transmit 2940bc7cf6fSBjoern A. Zeeb * ring in this PAGE. 2950bc7cf6fSBjoern A. Zeeb */ 2960bc7cf6fSBjoern A. Zeeb 2970bc7cf6fSBjoern A. Zeeb /* 2980bc7cf6fSBjoern A. Zeeb * Receive Descriptor corresponding to each entry in the receive ring 2990bc7cf6fSBjoern A. Zeeb */ 3000bc7cf6fSBjoern A. Zeeb typedef struct _q80_rcv_desc { 3010bc7cf6fSBjoern A. Zeeb uint16_t handle; 3020bc7cf6fSBjoern A. Zeeb uint16_t rsrvd; 3030bc7cf6fSBjoern A. Zeeb uint32_t buf_size; /* buffer size in bytes */ 3040bc7cf6fSBjoern A. Zeeb uint64_t buf_addr; /* physical address of buffer */ 3050bc7cf6fSBjoern A. Zeeb } __packed q80_recv_desc_t; 3060bc7cf6fSBjoern A. Zeeb 3070bc7cf6fSBjoern A. Zeeb /* 3080bc7cf6fSBjoern A. Zeeb * Status Descriptor corresponding to each entry in the Status ring 3090bc7cf6fSBjoern A. Zeeb */ 3100bc7cf6fSBjoern A. Zeeb typedef struct _q80_stat_desc { 3110bc7cf6fSBjoern A. Zeeb uint64_t data[2]; 3120bc7cf6fSBjoern A. Zeeb } __packed q80_stat_desc_t; 3130bc7cf6fSBjoern A. Zeeb 3140bc7cf6fSBjoern A. Zeeb /* 3150bc7cf6fSBjoern A. Zeeb * definitions for data[0] field of Status Descriptor 3160bc7cf6fSBjoern A. Zeeb */ 3170bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OWNER(data) ((data >> 56) & 0x3) 3180bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OWNER_HOST 0x1 3190bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OWNER_FW 0x2 3200bc7cf6fSBjoern A. Zeeb 3210bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OWNER_MASK (((uint64_t)0x3) << 56) 3220bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_SET_OWNER(owner) (uint64_t)(((uint64_t)owner) << 56) 3230bc7cf6fSBjoern A. Zeeb 3240bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OPCODE(data) ((data >> 58) & 0x003F) 3250bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OPCODE_SYN_OFFLOAD 0x03 3260bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OPCODE_RCV_PKT 0x04 3270bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OPCODE_CTRL_MSG 0x05 3280bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_OPCODE_LRO_PKT 0x12 3290bc7cf6fSBjoern A. Zeeb 3300bc7cf6fSBjoern A. Zeeb /* 3310bc7cf6fSBjoern A. Zeeb * definitions for data[0] field of Status Descriptor for standard frames 3320bc7cf6fSBjoern A. Zeeb * status descriptor opcode equals 0x04 3330bc7cf6fSBjoern A. Zeeb */ 3340bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_PORT(data) ((data) & 0x000F) 3350bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_STATUS(data) ((data >> 4) & 0x000F) 3360bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_STATUS_NO_CHKSUM 0x01 3370bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_STATUS_CHKSUM_OK 0x02 3380bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_STATUS_CHKSUM_ERR 0x03 3390bc7cf6fSBjoern A. Zeeb 3400bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_TYPE(data) ((data >> 8) & 0x000F) 3410bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_TOTAL_LENGTH(data) ((data >> 12) & 0xFFFF) 3420bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_HANDLE(data) ((data >> 28) & 0xFFFF) 3430bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_PROTOCOL(data) ((data >> 44) & 0x000F) 3440bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_L2_OFFSET(data) ((data >> 48) & 0x001F) 3450bc7cf6fSBjoern A. Zeeb #define Q8_STAT_DESC_COUNT(data) ((data >> 53) & 0x0007) 3460bc7cf6fSBjoern A. Zeeb 3470bc7cf6fSBjoern A. Zeeb /* 3480bc7cf6fSBjoern A. Zeeb * definitions for data[0-1] fields of Status Descriptor for LRO 3490bc7cf6fSBjoern A. Zeeb * status descriptor opcode equals 0x05 3500bc7cf6fSBjoern A. Zeeb */ 3510bc7cf6fSBjoern A. Zeeb /* definitions for data[0] field */ 3520bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_HANDLE(data) ((data) & 0xFFFF) 3530bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_PAYLOAD_LENGTH(data) ((data >> 16) & 0xFFFF) 3540bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_L2_OFFSET(data) ((data >> 32) & 0xFF) 3550bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_L4_OFFSET(data) ((data >> 40) & 0xFF) 3560bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_TS_PRESENT(data) ((data >> 48) & 0x1) 3570bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_TYPE(data) ((data >> 49) & 0x7) 3580bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_PUSH_BIT(data) ((data >> 52) & 0x1) 3590bc7cf6fSBjoern A. Zeeb 3600bc7cf6fSBjoern A. Zeeb /* definitions for data[1] field */ 3610bc7cf6fSBjoern A. Zeeb #define Q8_LRO_STAT_DESC_SEQ_NUM(data) (uint32_t)(data) 3620bc7cf6fSBjoern A. Zeeb 3630bc7cf6fSBjoern A. Zeeb /** Driver Related Definitions Begin **/ 3640bc7cf6fSBjoern A. Zeeb 3650bc7cf6fSBjoern A. Zeeb #define MAX_RDS_RINGS 2 /* Max# of Receive Descriptor Rings */ 3660bc7cf6fSBjoern A. Zeeb #define MAX_SDS_RINGS 4 /* Max# of Status Descriptor Rings */ 3670bc7cf6fSBjoern A. Zeeb #define TX_SMALL_PKT_SIZE 128 /* size in bytes of small packets */ 3680bc7cf6fSBjoern A. Zeeb 3690bc7cf6fSBjoern A. Zeeb /* The number of descriptors should be a power of 2 */ 3700bc7cf6fSBjoern A. Zeeb #define NUM_TX_DESCRIPTORS 2048 3710bc7cf6fSBjoern A. Zeeb #define NUM_RX_DESCRIPTORS 8192 3720bc7cf6fSBjoern A. Zeeb //#define NUM_RX_JUMBO_DESCRIPTORS 1024 3730bc7cf6fSBjoern A. Zeeb #define NUM_RX_JUMBO_DESCRIPTORS 2048 3740bc7cf6fSBjoern A. Zeeb //#define NUM_STATUS_DESCRIPTORS 8192 3750bc7cf6fSBjoern A. Zeeb #define NUM_STATUS_DESCRIPTORS 2048 3760bc7cf6fSBjoern A. Zeeb 3770bc7cf6fSBjoern A. Zeeb typedef struct _q80_rcv_cntxt_req { 3780bc7cf6fSBjoern A. Zeeb q80_rq_rcv_cntxt_t rx_req; 3790bc7cf6fSBjoern A. Zeeb q80_rq_rds_ring_t rds_req[MAX_RDS_RINGS]; 3800bc7cf6fSBjoern A. Zeeb q80_rq_sds_ring_t sds_req[MAX_SDS_RINGS]; 3810bc7cf6fSBjoern A. Zeeb } __packed q80_rcv_cntxt_req_t; 3820bc7cf6fSBjoern A. Zeeb 3830bc7cf6fSBjoern A. Zeeb typedef struct _q80_rcv_cntxt_rsp { 3840bc7cf6fSBjoern A. Zeeb q80_rsp_rcv_cntxt_t rx_rsp; 3850bc7cf6fSBjoern A. Zeeb q80_rsp_rds_ring_t rds_rsp[MAX_RDS_RINGS]; 3860bc7cf6fSBjoern A. Zeeb q80_rsp_sds_ring_t sds_rsp[MAX_SDS_RINGS]; 3870bc7cf6fSBjoern A. Zeeb } __packed q80_rcv_cntxt_rsp_t; 3880bc7cf6fSBjoern A. Zeeb 3890bc7cf6fSBjoern A. Zeeb /* 3900bc7cf6fSBjoern A. Zeeb * structure describing various dma buffers 3910bc7cf6fSBjoern A. Zeeb */ 3920bc7cf6fSBjoern A. Zeeb #define RDS_RING_INDEX_NORMAL 0 3930bc7cf6fSBjoern A. Zeeb #define RDS_RING_INDEX_JUMBO 1 3940bc7cf6fSBjoern A. Zeeb 3950bc7cf6fSBjoern A. Zeeb typedef struct qla_dmabuf { 3960bc7cf6fSBjoern A. Zeeb volatile struct { 3970bc7cf6fSBjoern A. Zeeb uint32_t tx_ring :1, 3980bc7cf6fSBjoern A. Zeeb rds_ring :1, 3990bc7cf6fSBjoern A. Zeeb sds_ring :1, 4000bc7cf6fSBjoern A. Zeeb context :1; 4010bc7cf6fSBjoern A. Zeeb } flags; 4020bc7cf6fSBjoern A. Zeeb 4030bc7cf6fSBjoern A. Zeeb qla_dma_t tx_ring; 4040bc7cf6fSBjoern A. Zeeb qla_dma_t rds_ring[MAX_RDS_RINGS]; 4050bc7cf6fSBjoern A. Zeeb qla_dma_t sds_ring[MAX_SDS_RINGS]; 4060bc7cf6fSBjoern A. Zeeb qla_dma_t context; 4070bc7cf6fSBjoern A. Zeeb } qla_dmabuf_t; 4080bc7cf6fSBjoern A. Zeeb 4090bc7cf6fSBjoern A. Zeeb /** Driver Related Definitions End **/ 4100bc7cf6fSBjoern A. Zeeb 4110bc7cf6fSBjoern A. Zeeb /* 4120bc7cf6fSBjoern A. Zeeb * Firmware Control Descriptor 4130bc7cf6fSBjoern A. Zeeb */ 4140bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_hdr { 4150bc7cf6fSBjoern A. Zeeb uint64_t cmd; 4160bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_CNTRL_REQ (0x13 << 23) 4170bc7cf6fSBjoern A. Zeeb uint8_t opcode; 4180bc7cf6fSBjoern A. Zeeb uint8_t cookie; 4190bc7cf6fSBjoern A. Zeeb uint16_t cntxt_id; 4200bc7cf6fSBjoern A. Zeeb uint8_t response; 4210bc7cf6fSBjoern A. Zeeb #define Q8_FW_CDS_HDR_COMPLETION 0x1 4220bc7cf6fSBjoern A. Zeeb uint16_t rsrvd; 4230bc7cf6fSBjoern A. Zeeb uint8_t sub_opcode; 4240bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_hdr_t; 4250bc7cf6fSBjoern A. Zeeb 4260bc7cf6fSBjoern A. Zeeb /* 4270bc7cf6fSBjoern A. Zeeb * definitions for opcode in qla_fw_cds_hdr_t 4280bc7cf6fSBjoern A. Zeeb */ 4290bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_RSS 0x01 4300bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_RSS_TABLE 0x02 4310bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_INTR_COALESCING 0x03 4320bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_LED 0x04 4330bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_MAC_ADDR 0x06 4340bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_LRO_FLOW 0x07 4350bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_GET_SNMP_STATS 0x08 4360bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_MAC_RCV_MODE 0x0C 4370bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_STATISTICS 0x10 4380bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_IPADDR 0x12 4390bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_LOOPBACK 0x13 4400bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_LINK_EVENT_REQ 0x15 4410bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_BRIDGING 0x17 4420bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_OPCODE_CONFIG_LRO 0x18 4430bc7cf6fSBjoern A. Zeeb 4440bc7cf6fSBjoern A. Zeeb /* 4450bc7cf6fSBjoern A. Zeeb * Configure RSS 4460bc7cf6fSBjoern A. Zeeb */ 4470bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_config_rss { 4480bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 4490bc7cf6fSBjoern A. Zeeb uint8_t hash_type; 4500bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_HASH_TYPE_IPV4_TCP (0x2 << 4) 4510bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_HASH_TYPE_IPV4_IP (0x1 << 4) 4520bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_HASH_TYPE_IPV4_TCP_IP (0x3 << 4) 4530bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_HASH_TYPE_IPV6_TCP (0x2 << 6) 4540bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_HASH_TYPE_IPV6_IP (0x1 << 6) 4550bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_HASH_TYPE_IPV6_TCP_IP (0x3 << 6) 4560bc7cf6fSBjoern A. Zeeb 4570bc7cf6fSBjoern A. Zeeb uint8_t flags; 4580bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_FLAGS_ENABLE_RSS 0x1 4590bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_RSS_FLAGS_USE_IND_TABLE 0x2 4600bc7cf6fSBjoern A. Zeeb uint8_t rsrvd[4]; 4610bc7cf6fSBjoern A. Zeeb uint16_t ind_tbl_mask; 4620bc7cf6fSBjoern A. Zeeb uint64_t rss_key[5]; 4630bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_config_rss_t; 4640bc7cf6fSBjoern A. Zeeb 4650bc7cf6fSBjoern A. Zeeb /* 4660bc7cf6fSBjoern A. Zeeb * Configure RSS Table 4670bc7cf6fSBjoern A. Zeeb */ 4680bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_config_rss_table { 4690bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 4700bc7cf6fSBjoern A. Zeeb uint64_t index; 4710bc7cf6fSBjoern A. Zeeb uint8_t table[40]; 4720bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_config_rss_table_t; 4730bc7cf6fSBjoern A. Zeeb 4740bc7cf6fSBjoern A. Zeeb /* 4750bc7cf6fSBjoern A. Zeeb * Configure Interrupt Coalescing 4760bc7cf6fSBjoern A. Zeeb */ 4770bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_config_intr_coalesc { 4780bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 4790bc7cf6fSBjoern A. Zeeb uint16_t rsrvd0; 4800bc7cf6fSBjoern A. Zeeb uint16_t rsrvd1; 4810bc7cf6fSBjoern A. Zeeb uint16_t flags; 4820bc7cf6fSBjoern A. Zeeb uint16_t rsrvd2; 4830bc7cf6fSBjoern A. Zeeb uint64_t rsrvd3; 4840bc7cf6fSBjoern A. Zeeb uint16_t max_rcv_pkts; 4850bc7cf6fSBjoern A. Zeeb uint16_t max_rcv_usecs; 4860bc7cf6fSBjoern A. Zeeb uint16_t max_snd_pkts; 4870bc7cf6fSBjoern A. Zeeb uint16_t max_snd_usecs; 4880bc7cf6fSBjoern A. Zeeb uint64_t rsrvd4; 4890bc7cf6fSBjoern A. Zeeb uint64_t rsrvd5; 4900bc7cf6fSBjoern A. Zeeb uint32_t usecs_to; 4910bc7cf6fSBjoern A. Zeeb uint8_t timer_type; 4920bc7cf6fSBjoern A. Zeeb #define Q8_FWCMD_INTR_COALESC_TIMER_NONE 0x00 4930bc7cf6fSBjoern A. Zeeb #define Q8_FWCMD_INTR_COALESC_TIMER_ONCE 0x01 4940bc7cf6fSBjoern A. Zeeb #define Q8_FWCMD_INTR_COALESC_TIMER_PERIODIC 0x02 4950bc7cf6fSBjoern A. Zeeb 4960bc7cf6fSBjoern A. Zeeb uint8_t sds_ring_bitmask; 4970bc7cf6fSBjoern A. Zeeb #define Q8_FWCMD_INTR_COALESC_SDS_RING_0 0x01 4980bc7cf6fSBjoern A. Zeeb #define Q8_FWCMD_INTR_COALESC_SDS_RING_1 0x02 4990bc7cf6fSBjoern A. Zeeb #define Q8_FWCMD_INTR_COALESC_SDS_RING_2 0x04 5000bc7cf6fSBjoern A. Zeeb #define Q8_FWCMD_INTR_COALESC_SDS_RING_3 0x08 5010bc7cf6fSBjoern A. Zeeb 5020bc7cf6fSBjoern A. Zeeb uint16_t rsrvd6; 5030bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_config_intr_coalesc_t; 5040bc7cf6fSBjoern A. Zeeb 5050bc7cf6fSBjoern A. Zeeb /* 5060bc7cf6fSBjoern A. Zeeb * Configure LED Parameters 5070bc7cf6fSBjoern A. Zeeb */ 5080bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_config_led { 5090bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 5100bc7cf6fSBjoern A. Zeeb uint32_t cntxt_id; 5110bc7cf6fSBjoern A. Zeeb uint32_t blink_rate; 5120bc7cf6fSBjoern A. Zeeb uint32_t blink_state; 5130bc7cf6fSBjoern A. Zeeb uint32_t rsrvd; 5140bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_config_led_t; 5150bc7cf6fSBjoern A. Zeeb 5160bc7cf6fSBjoern A. Zeeb /* 5170bc7cf6fSBjoern A. Zeeb * Configure MAC Address 5180bc7cf6fSBjoern A. Zeeb */ 5190bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_config_mac_addr { 5200bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 5210bc7cf6fSBjoern A. Zeeb uint8_t cmd; 5220bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_ADD_MAC_ADDR 0x1 5230bc7cf6fSBjoern A. Zeeb #define Q8_FWCD_DEL_MAC_ADDR 0x2 5240bc7cf6fSBjoern A. Zeeb uint8_t rsrvd; 5250bc7cf6fSBjoern A. Zeeb uint8_t mac_addr[6]; 5260bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_config_mac_addr_t; 5270bc7cf6fSBjoern A. Zeeb 5280bc7cf6fSBjoern A. Zeeb /* 5290bc7cf6fSBjoern A. Zeeb * Configure Add/Delete LRO 5300bc7cf6fSBjoern A. Zeeb */ 5310bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_config_lro { 5320bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 5330bc7cf6fSBjoern A. Zeeb uint32_t dst_ip_addr; 5340bc7cf6fSBjoern A. Zeeb uint32_t src_ip_addr; 5350bc7cf6fSBjoern A. Zeeb uint16_t dst_tcp_port; 5360bc7cf6fSBjoern A. Zeeb uint16_t src_tcp_port; 5370bc7cf6fSBjoern A. Zeeb uint8_t ipv6; 5380bc7cf6fSBjoern A. Zeeb uint8_t time_stamp; 5390bc7cf6fSBjoern A. Zeeb uint16_t rsrvd; 5400bc7cf6fSBjoern A. Zeeb uint32_t rss_hash; 5410bc7cf6fSBjoern A. Zeeb uint32_t host_handle; 5420bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_config_lro_t; 5430bc7cf6fSBjoern A. Zeeb 5440bc7cf6fSBjoern A. Zeeb /* 5450bc7cf6fSBjoern A. Zeeb * Get SNMP Statistics 5460bc7cf6fSBjoern A. Zeeb */ 5470bc7cf6fSBjoern A. Zeeb typedef struct _qla_fw_cds_get_snmp { 5480bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 5490bc7cf6fSBjoern A. Zeeb uint64_t phys_addr; 5500bc7cf6fSBjoern A. Zeeb uint16_t size; 5510bc7cf6fSBjoern A. Zeeb uint16_t cntxt_id; 5520bc7cf6fSBjoern A. Zeeb uint32_t rsrvd; 5530bc7cf6fSBjoern A. Zeeb } __packed qla_fw_cds_get_snmp_t; 5540bc7cf6fSBjoern A. Zeeb 5550bc7cf6fSBjoern A. Zeeb typedef struct _qla_snmp_stats { 5560bc7cf6fSBjoern A. Zeeb uint64_t jabber_state; 5570bc7cf6fSBjoern A. Zeeb uint64_t false_carrier; 5580bc7cf6fSBjoern A. Zeeb uint64_t rsrvd; 5590bc7cf6fSBjoern A. Zeeb uint64_t mac_cntrl; 5600bc7cf6fSBjoern A. Zeeb uint64_t align_errors; 5610bc7cf6fSBjoern A. Zeeb uint64_t chksum_errors; 5620bc7cf6fSBjoern A. Zeeb uint64_t oversize_frames; 5630bc7cf6fSBjoern A. Zeeb uint64_t tx_errors; 5640bc7cf6fSBjoern A. Zeeb uint64_t mac_rcv_errors; 5650bc7cf6fSBjoern A. Zeeb uint64_t phy_rcv_errors; 5660bc7cf6fSBjoern A. Zeeb uint64_t rcv_pause; 5670bc7cf6fSBjoern A. Zeeb uint64_t tx_pause; 5680bc7cf6fSBjoern A. Zeeb } __packed qla_snmp_stats_t; 5690bc7cf6fSBjoern A. Zeeb 5700bc7cf6fSBjoern A. Zeeb /* 5710bc7cf6fSBjoern A. Zeeb * Enable Link Event Requests 5720bc7cf6fSBjoern A. Zeeb */ 5730bc7cf6fSBjoern A. Zeeb typedef struct _qla_link_event_req { 5740bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 5750bc7cf6fSBjoern A. Zeeb uint8_t enable; 5760bc7cf6fSBjoern A. Zeeb uint8_t get_clnk_params; 5770bc7cf6fSBjoern A. Zeeb uint8_t pad[6]; 5780bc7cf6fSBjoern A. Zeeb } __packed qla_link_event_req_t; 5790bc7cf6fSBjoern A. Zeeb 5800bc7cf6fSBjoern A. Zeeb /* 5810bc7cf6fSBjoern A. Zeeb * Set MAC Receive Mode 5820bc7cf6fSBjoern A. Zeeb */ 5830bc7cf6fSBjoern A. Zeeb typedef struct _qla_set_mac_rcv_mode { 5840bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 5850bc7cf6fSBjoern A. Zeeb 5860bc7cf6fSBjoern A. Zeeb uint32_t mode; 5870bc7cf6fSBjoern A. Zeeb #define Q8_MAC_RCV_RESET_PROMISC_ALLMULTI 0x00 5880bc7cf6fSBjoern A. Zeeb #define Q8_MAC_RCV_ENABLE_PROMISCUOUS 0x01 5890bc7cf6fSBjoern A. Zeeb #define Q8_MAC_RCV_ENABLE_ALLMULTI 0x02 5900bc7cf6fSBjoern A. Zeeb 5910bc7cf6fSBjoern A. Zeeb uint8_t pad[4]; 5920bc7cf6fSBjoern A. Zeeb } __packed qla_set_mac_rcv_mode_t; 5930bc7cf6fSBjoern A. Zeeb 5940bc7cf6fSBjoern A. Zeeb /* 5950bc7cf6fSBjoern A. Zeeb * Configure IP Address 5960bc7cf6fSBjoern A. Zeeb */ 5970bc7cf6fSBjoern A. Zeeb typedef struct _qla_config_ipv4 { 5980bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 5990bc7cf6fSBjoern A. Zeeb 6000bc7cf6fSBjoern A. Zeeb uint64_t cmd; 6010bc7cf6fSBjoern A. Zeeb #define Q8_CONFIG_CMD_IP_ENABLE 0x02 6020bc7cf6fSBjoern A. Zeeb #define Q8_CONFIG_CMD_IP_DISABLE 0x03 6030bc7cf6fSBjoern A. Zeeb 6040bc7cf6fSBjoern A. Zeeb uint64_t ipv4_addr; 6050bc7cf6fSBjoern A. Zeeb } __packed qla_config_ipv4_t; 6060bc7cf6fSBjoern A. Zeeb 6070bc7cf6fSBjoern A. Zeeb /* 6080bc7cf6fSBjoern A. Zeeb * Configure LRO 6090bc7cf6fSBjoern A. Zeeb */ 6100bc7cf6fSBjoern A. Zeeb typedef struct _qla_config_lro { 6110bc7cf6fSBjoern A. Zeeb qla_fw_cds_hdr_t hdr; 6120bc7cf6fSBjoern A. Zeeb 6130bc7cf6fSBjoern A. Zeeb uint64_t cmd; 6140bc7cf6fSBjoern A. Zeeb #define Q8_CONFIG_LRO_ENABLE 0x08 6150bc7cf6fSBjoern A. Zeeb } __packed qla_config_lro_t; 6160bc7cf6fSBjoern A. Zeeb 6170bc7cf6fSBjoern A. Zeeb /* 6180bc7cf6fSBjoern A. Zeeb * Control Messages Received on SDS Ring 6190bc7cf6fSBjoern A. Zeeb */ 6200bc7cf6fSBjoern A. Zeeb /* Header */ 6210bc7cf6fSBjoern A. Zeeb typedef struct _qla_cntrl_msg_hdr { 6220bc7cf6fSBjoern A. Zeeb uint16_t rsrvd0; 6230bc7cf6fSBjoern A. Zeeb uint16_t err_code; 6240bc7cf6fSBjoern A. Zeeb uint8_t rsp_type; 6250bc7cf6fSBjoern A. Zeeb uint8_t comp_id; 6260bc7cf6fSBjoern A. Zeeb uint16_t tag; 6270bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_MSG_TAG_DESC_COUNT_MASK (0x7 << 5) 6280bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_MSG_TAG_OWNER_MASK (0x3 << 8) 6290bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_MSG_TAG_OPCODE_MASK (0x3F << 10) 6300bc7cf6fSBjoern A. Zeeb } __packed qla_cntrl_msg_hdr_t; 6310bc7cf6fSBjoern A. Zeeb 6320bc7cf6fSBjoern A. Zeeb /* 6330bc7cf6fSBjoern A. Zeeb * definitions for rsp_type in qla_cntrl_msg_hdr_t 6340bc7cf6fSBjoern A. Zeeb */ 6350bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_CONFIG_MAC_RSP 0x85 6360bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_LRO_FLOW_DELETE_RSP 0x86 6370bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_LRO_FLOW_ADD_FAILURE_RSP 0x87 6380bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_GET_SNMP_STATS_RSP 0x88 6390bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_GET_NETWORK_STATS_RSP 0x8C 6400bc7cf6fSBjoern A. Zeeb #define Q8_CTRL_LINK_EVENT_NOTIFICATION 0x8D 6410bc7cf6fSBjoern A. Zeeb 6420bc7cf6fSBjoern A. Zeeb /* 6430bc7cf6fSBjoern A. Zeeb * Configure MAC Response 6440bc7cf6fSBjoern A. Zeeb */ 6450bc7cf6fSBjoern A. Zeeb typedef struct _qla_config_mac_rsp { 6460bc7cf6fSBjoern A. Zeeb uint32_t rval; 6470bc7cf6fSBjoern A. Zeeb uint32_t rsrvd; 6480bc7cf6fSBjoern A. Zeeb } __packed qla_config_mac_rsp_t; 6490bc7cf6fSBjoern A. Zeeb 6500bc7cf6fSBjoern A. Zeeb /* 6510bc7cf6fSBjoern A. Zeeb * LRO Flow Response (can be LRO Flow Delete and LRO Flow Add Failure) 6520bc7cf6fSBjoern A. Zeeb */ 6530bc7cf6fSBjoern A. Zeeb typedef struct _qla_lro_flow_rsp { 6540bc7cf6fSBjoern A. Zeeb uint32_t handle; 6550bc7cf6fSBjoern A. Zeeb uint32_t rss_hash; 6560bc7cf6fSBjoern A. Zeeb uint32_t dst_ip; 6570bc7cf6fSBjoern A. Zeeb uint32_t src_ip; 6580bc7cf6fSBjoern A. Zeeb uint16_t dst_tcp_port; 6590bc7cf6fSBjoern A. Zeeb uint16_t src_tcp_port; 6600bc7cf6fSBjoern A. Zeeb uint8_t ipv6; 6610bc7cf6fSBjoern A. Zeeb uint8_t rsrvd0; 6620bc7cf6fSBjoern A. Zeeb uint16_t rsrvd1; 6630bc7cf6fSBjoern A. Zeeb } __packed qla_lro_flow_rsp_t; 6640bc7cf6fSBjoern A. Zeeb 6650bc7cf6fSBjoern A. Zeeb /* 6660bc7cf6fSBjoern A. Zeeb * Get SNMP Statistics Response 6670bc7cf6fSBjoern A. Zeeb */ 6680bc7cf6fSBjoern A. Zeeb typedef struct _qla_get_snmp_stats_rsp { 6690bc7cf6fSBjoern A. Zeeb uint64_t rsrvd; 6700bc7cf6fSBjoern A. Zeeb } __packed qla_get_snmp_stats_rsp_t; 6710bc7cf6fSBjoern A. Zeeb 6720bc7cf6fSBjoern A. Zeeb /* 6730bc7cf6fSBjoern A. Zeeb * Get Network Statistics Response 6740bc7cf6fSBjoern A. Zeeb */ 6750bc7cf6fSBjoern A. Zeeb typedef struct _qla_get_net_stats_rsp { 6760bc7cf6fSBjoern A. Zeeb uint64_t rsrvd; 6770bc7cf6fSBjoern A. Zeeb } __packed qla_get_net_stats_rsp_t; 6780bc7cf6fSBjoern A. Zeeb 6790bc7cf6fSBjoern A. Zeeb /* 6800bc7cf6fSBjoern A. Zeeb * Link Event Notification 6810bc7cf6fSBjoern A. Zeeb */ 6820bc7cf6fSBjoern A. Zeeb typedef struct _qla_link_event { 6830bc7cf6fSBjoern A. Zeeb uint32_t cable_oui; 6840bc7cf6fSBjoern A. Zeeb uint16_t cable_length; 6850bc7cf6fSBjoern A. Zeeb 6860bc7cf6fSBjoern A. Zeeb uint16_t link_speed; 6870bc7cf6fSBjoern A. Zeeb #define Q8_LE_SPEED_MASK 0xFFF 6880bc7cf6fSBjoern A. Zeeb #define Q8_LE_SPEED_10GBPS 0x710 6890bc7cf6fSBjoern A. Zeeb #define Q8_LE_SPEED_1GBPS 0x3E8 6900bc7cf6fSBjoern A. Zeeb #define Q8_LE_SPEED_100MBPS 0x064 6910bc7cf6fSBjoern A. Zeeb #define Q8_LE_SPEED_10MBPS 0x00A 6920bc7cf6fSBjoern A. Zeeb 6930bc7cf6fSBjoern A. Zeeb uint8_t link_up;/* 0 = down; else up */ 6940bc7cf6fSBjoern A. Zeeb 6950bc7cf6fSBjoern A. Zeeb uint8_t mod_info; 6960bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_MODULE_NOT_PRESENT 0x01 6970bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_UNKNOWN_OPTICAL_MODULE 0x02 6980bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_SR_LR_OPTICAL_MODULE 0x03 6990bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_LRM_OPTICAL_MODULE 0x04 7000bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_SFP_1G_MODULE 0x05 7010bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_UNSUPPORTED_TWINAX 0x06 7020bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_UNSUPPORTED_TWINAX_LENGTH 0x07 7030bc7cf6fSBjoern A. Zeeb #define Q8_LE_MI_SUPPORTED_TWINAX 0x08 7040bc7cf6fSBjoern A. Zeeb 7050bc7cf6fSBjoern A. Zeeb uint8_t fduplex; /* 1 = full duplex; 0 = half duplex */ 7060bc7cf6fSBjoern A. Zeeb uint8_t autoneg; /* 1 = autoneg enable; 0 = disabled */ 7070bc7cf6fSBjoern A. Zeeb uint32_t rsrvd; 7080bc7cf6fSBjoern A. Zeeb } __packed qla_link_event_t; 7090bc7cf6fSBjoern A. Zeeb 7100bc7cf6fSBjoern A. Zeeb typedef struct _qla_sds { 7110bc7cf6fSBjoern A. Zeeb q80_stat_desc_t *sds_ring_base; /* start of sds ring */ 7120bc7cf6fSBjoern A. Zeeb uint32_t sdsr_next; /* next entry in SDS ring to process */ 7130bc7cf6fSBjoern A. Zeeb struct lro_ctrl lro; 7140bc7cf6fSBjoern A. Zeeb void *rxb_free; 7150bc7cf6fSBjoern A. Zeeb uint32_t rx_free; 7160bc7cf6fSBjoern A. Zeeb void *rxjb_free; 7170bc7cf6fSBjoern A. Zeeb uint32_t rxj_free; 7180bc7cf6fSBjoern A. Zeeb volatile uint32_t rcv_active; 7190bc7cf6fSBjoern A. Zeeb } qla_sds_t; 7200bc7cf6fSBjoern A. Zeeb 721088fc971SDavid C Somayajulu #define QL_FRAME_HDR_SIZE (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN +\ 722088fc971SDavid C Somayajulu sizeof (struct ip) + sizeof (struct tcphdr) + 16) 7230bc7cf6fSBjoern A. Zeeb /* 7240bc7cf6fSBjoern A. Zeeb * struct for storing hardware specific information for a given interface 7250bc7cf6fSBjoern A. Zeeb */ 7260bc7cf6fSBjoern A. Zeeb typedef struct _qla_hw { 7270bc7cf6fSBjoern A. Zeeb struct { 7280bc7cf6fSBjoern A. Zeeb uint32_t 7290bc7cf6fSBjoern A. Zeeb lro :1, 7300bc7cf6fSBjoern A. Zeeb init_tx_cnxt :1, 7310bc7cf6fSBjoern A. Zeeb init_rx_cnxt :1, 7320bc7cf6fSBjoern A. Zeeb fduplex :1, 7330bc7cf6fSBjoern A. Zeeb autoneg :1, 7340bc7cf6fSBjoern A. Zeeb link_up :1; 7350bc7cf6fSBjoern A. Zeeb } flags; 7360bc7cf6fSBjoern A. Zeeb 7370bc7cf6fSBjoern A. Zeeb uint16_t link_speed; 7380bc7cf6fSBjoern A. Zeeb uint16_t cable_length; 7390bc7cf6fSBjoern A. Zeeb uint16_t cable_oui; 7400bc7cf6fSBjoern A. Zeeb uint8_t mod_info; 7410bc7cf6fSBjoern A. Zeeb uint8_t rsrvd; 7420bc7cf6fSBjoern A. Zeeb 7430bc7cf6fSBjoern A. Zeeb uint32_t max_rds_per_cntxt; 7440bc7cf6fSBjoern A. Zeeb uint32_t max_sds_per_cntxt; 7450bc7cf6fSBjoern A. Zeeb uint32_t max_rules_per_cntxt; 7460bc7cf6fSBjoern A. Zeeb uint32_t max_rcv_cntxts; 7470bc7cf6fSBjoern A. Zeeb uint32_t max_xmt_cntxts; 7480bc7cf6fSBjoern A. Zeeb uint32_t max_mtu; 7490bc7cf6fSBjoern A. Zeeb uint32_t max_lro; 7500bc7cf6fSBjoern A. Zeeb 7510bc7cf6fSBjoern A. Zeeb uint8_t mac_addr[ETHER_ADDR_LEN]; 7520bc7cf6fSBjoern A. Zeeb 7530bc7cf6fSBjoern A. Zeeb uint16_t num_rds_rings; 7540bc7cf6fSBjoern A. Zeeb uint16_t num_sds_rings; 7550bc7cf6fSBjoern A. Zeeb 7560bc7cf6fSBjoern A. Zeeb qla_dmabuf_t dma_buf; 7570bc7cf6fSBjoern A. Zeeb 7580bc7cf6fSBjoern A. Zeeb /* Transmit Side */ 7590bc7cf6fSBjoern A. Zeeb 7600bc7cf6fSBjoern A. Zeeb q80_tx_cmd_t *tx_ring_base; 7610bc7cf6fSBjoern A. Zeeb 7620bc7cf6fSBjoern A. Zeeb q80_tx_cntxt_req_t *tx_cntxt_req; /* TX Context Request */ 7630bc7cf6fSBjoern A. Zeeb bus_addr_t tx_cntxt_req_paddr; 7640bc7cf6fSBjoern A. Zeeb 7650bc7cf6fSBjoern A. Zeeb q80_tx_cntxt_rsp_t *tx_cntxt_rsp; /* TX Context Response */ 7660bc7cf6fSBjoern A. Zeeb bus_addr_t tx_cntxt_rsp_paddr; 7670bc7cf6fSBjoern A. Zeeb 7680bc7cf6fSBjoern A. Zeeb uint32_t *tx_cons; /* tx consumer shadow reg */ 7690bc7cf6fSBjoern A. Zeeb bus_addr_t tx_cons_paddr; 7700bc7cf6fSBjoern A. Zeeb 7710bc7cf6fSBjoern A. Zeeb volatile uint32_t txr_free; /* # of free entries in tx ring */ 7720bc7cf6fSBjoern A. Zeeb volatile uint32_t txr_next; /* # next available tx ring entry */ 7730bc7cf6fSBjoern A. Zeeb volatile uint32_t txr_comp; /* index of last tx entry completed */ 7740bc7cf6fSBjoern A. Zeeb 7750bc7cf6fSBjoern A. Zeeb uint32_t tx_prod_reg; 7760bc7cf6fSBjoern A. Zeeb 7770bc7cf6fSBjoern A. Zeeb /* Receive Side */ 7780bc7cf6fSBjoern A. Zeeb volatile uint32_t rx_next; /* next standard rcv ring to arm fw */ 7790bc7cf6fSBjoern A. Zeeb volatile int32_t rxj_next; /* next jumbo rcv ring to arm fw */ 7800bc7cf6fSBjoern A. Zeeb 7810bc7cf6fSBjoern A. Zeeb volatile int32_t rx_in; /* next standard rcv ring to add mbufs */ 7820bc7cf6fSBjoern A. Zeeb volatile int32_t rxj_in; /* next jumbo rcv ring to add mbufs */ 7830bc7cf6fSBjoern A. Zeeb 7840bc7cf6fSBjoern A. Zeeb q80_rcv_cntxt_req_t *rx_cntxt_req; /* Rcv Context Request */ 7850bc7cf6fSBjoern A. Zeeb bus_addr_t rx_cntxt_req_paddr; 7860bc7cf6fSBjoern A. Zeeb q80_rcv_cntxt_rsp_t *rx_cntxt_rsp; /* Rcv Context Response */ 7870bc7cf6fSBjoern A. Zeeb bus_addr_t rx_cntxt_rsp_paddr; 7880bc7cf6fSBjoern A. Zeeb 7890bc7cf6fSBjoern A. Zeeb qla_sds_t sds[MAX_SDS_RINGS]; 790088fc971SDavid C Somayajulu 791088fc971SDavid C Somayajulu uint8_t frame_hdr[QL_FRAME_HDR_SIZE]; 7920bc7cf6fSBjoern A. Zeeb } qla_hw_t; 7930bc7cf6fSBjoern A. Zeeb 7940bc7cf6fSBjoern A. Zeeb #define QL_UPDATE_RDS_PRODUCER_INDEX(ha, i, val) \ 7950bc7cf6fSBjoern A. Zeeb WRITE_REG32(ha, ((ha->hw.rx_cntxt_rsp)->rds_rsp[i].producer_reg +\ 7960bc7cf6fSBjoern A. Zeeb 0x1b2000), val) 7970bc7cf6fSBjoern A. Zeeb 7980bc7cf6fSBjoern A. Zeeb #define QL_UPDATE_TX_PRODUCER_INDEX(ha, val) \ 7990bc7cf6fSBjoern A. Zeeb WRITE_REG32(ha, (ha->hw.tx_prod_reg + 0x1b2000), val) 8000bc7cf6fSBjoern A. Zeeb 8010bc7cf6fSBjoern A. Zeeb #define QL_UPDATE_SDS_CONSUMER_INDEX(ha, i, val) \ 8020bc7cf6fSBjoern A. Zeeb WRITE_REG32(ha, ((ha->hw.rx_cntxt_rsp)->sds_rsp[i].consumer_reg +\ 8030bc7cf6fSBjoern A. Zeeb 0x1b2000), val) 8040bc7cf6fSBjoern A. Zeeb 8050bc7cf6fSBjoern A. Zeeb #define QL_CLEAR_INTERRUPTS(ha) \ 8060bc7cf6fSBjoern A. Zeeb if (ha->pci_func == 0) {\ 8070bc7cf6fSBjoern A. Zeeb WRITE_REG32(ha, Q8_INT_TARGET_STATUS_F0, 0xFFFFFFFF);\ 8080bc7cf6fSBjoern A. Zeeb } else {\ 8090bc7cf6fSBjoern A. Zeeb WRITE_REG32(ha, Q8_INT_TARGET_STATUS_F1, 0xFFFFFFFF);\ 8100bc7cf6fSBjoern A. Zeeb }\ 8110bc7cf6fSBjoern A. Zeeb 8120bc7cf6fSBjoern A. Zeeb #define QL_ENABLE_INTERRUPTS(ha, sds_index) \ 8130bc7cf6fSBjoern A. Zeeb {\ 8140bc7cf6fSBjoern A. Zeeb q80_rsp_sds_ring_t *rsp_sds;\ 8150bc7cf6fSBjoern A. Zeeb rsp_sds = &((ha->hw.rx_cntxt_rsp)->sds_rsp[sds_index]);\ 8160bc7cf6fSBjoern A. Zeeb WRITE_REG32(ha, (rsp_sds->intr_mask_reg + 0x1b2000), 0x1);\ 8170bc7cf6fSBjoern A. Zeeb } 8180bc7cf6fSBjoern A. Zeeb 8190bc7cf6fSBjoern A. Zeeb #define QL_DISABLE_INTERRUPTS(ha, sds_index) \ 8200bc7cf6fSBjoern A. Zeeb {\ 8210bc7cf6fSBjoern A. Zeeb q80_rsp_sds_ring_t *rsp_sds;\ 8220bc7cf6fSBjoern A. Zeeb rsp_sds = &((ha->hw.rx_cntxt_rsp)->sds_rsp[sds_index]);\ 8230bc7cf6fSBjoern A. Zeeb WRITE_REG32(ha, (rsp_sds->intr_mask_reg + 0x1b2000), 0x0);\ 8240bc7cf6fSBjoern A. Zeeb } 8250bc7cf6fSBjoern A. Zeeb 8260bc7cf6fSBjoern A. Zeeb #define QL_BUFFER_ALIGN 16 8270bc7cf6fSBjoern A. Zeeb 8280bc7cf6fSBjoern A. Zeeb #endif /* #ifndef _QLA_HW_H_ */ 829