xref: /freebsd/sys/dev/qlxgb/qla_hw.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
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