cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qlcnic.h (67276B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * QLogic qlcnic NIC Driver
      4 * Copyright (c) 2009-2013 QLogic Corporation
      5 */
      6
      7#ifndef _QLCNIC_H_
      8#define _QLCNIC_H_
      9
     10#include <linux/module.h>
     11#include <linux/kernel.h>
     12#include <linux/types.h>
     13#include <linux/ioport.h>
     14#include <linux/pci.h>
     15#include <linux/netdevice.h>
     16#include <linux/etherdevice.h>
     17#include <linux/ip.h>
     18#include <linux/in.h>
     19#include <linux/tcp.h>
     20#include <linux/skbuff.h>
     21#include <linux/firmware.h>
     22#include <linux/ethtool.h>
     23#include <linux/mii.h>
     24#include <linux/timer.h>
     25#include <linux/irq.h>
     26#include <linux/vmalloc.h>
     27#include <linux/io.h>
     28#include <asm/byteorder.h>
     29#include <linux/bitops.h>
     30#include <linux/if_vlan.h>
     31
     32#include "qlcnic_hdr.h"
     33#include "qlcnic_hw.h"
     34#include "qlcnic_83xx_hw.h"
     35#include "qlcnic_dcb.h"
     36
     37#define _QLCNIC_LINUX_MAJOR 5
     38#define _QLCNIC_LINUX_MINOR 3
     39#define _QLCNIC_LINUX_SUBVERSION 66
     40#define QLCNIC_LINUX_VERSIONID  "5.3.66"
     41#define QLCNIC_DRV_IDC_VER  0x01
     42#define QLCNIC_DRIVER_VERSION  ((_QLCNIC_LINUX_MAJOR << 16) |\
     43		 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
     44
     45#define QLCNIC_VERSION_CODE(a, b, c)	(((a) << 24) + ((b) << 16) + (c))
     46#define _major(v)	(((v) >> 24) & 0xff)
     47#define _minor(v)	(((v) >> 16) & 0xff)
     48#define _build(v)	((v) & 0xffff)
     49
     50/* version in image has weird encoding:
     51 *  7:0  - major
     52 * 15:8  - minor
     53 * 31:16 - build (little endian)
     54 */
     55#define QLCNIC_DECODE_VERSION(v) \
     56	QLCNIC_VERSION_CODE(((v) & 0xff), (((v) >> 8) & 0xff), ((v) >> 16))
     57
     58#define QLCNIC_MIN_FW_VERSION     QLCNIC_VERSION_CODE(4, 4, 2)
     59#define QLCNIC_NUM_FLASH_SECTORS (64)
     60#define QLCNIC_FLASH_SECTOR_SIZE (64 * 1024)
     61#define QLCNIC_FLASH_TOTAL_SIZE  (QLCNIC_NUM_FLASH_SECTORS \
     62					* QLCNIC_FLASH_SECTOR_SIZE)
     63
     64#define RCV_DESC_RINGSIZE(rds_ring)	\
     65	(sizeof(struct rcv_desc) * (rds_ring)->num_desc)
     66#define RCV_BUFF_RINGSIZE(rds_ring)	\
     67	(sizeof(struct qlcnic_rx_buffer) * rds_ring->num_desc)
     68#define STATUS_DESC_RINGSIZE(sds_ring)	\
     69	(sizeof(struct status_desc) * (sds_ring)->num_desc)
     70#define TX_BUFF_RINGSIZE(tx_ring)	\
     71	(sizeof(struct qlcnic_cmd_buffer) * tx_ring->num_desc)
     72#define TX_DESC_RINGSIZE(tx_ring)	\
     73	(sizeof(struct cmd_desc_type0) * tx_ring->num_desc)
     74
     75#define QLCNIC_P3P_A0		0x50
     76#define QLCNIC_P3P_C0		0x58
     77
     78#define QLCNIC_IS_REVISION_P3P(REVISION)     (REVISION >= QLCNIC_P3P_A0)
     79
     80#define FIRST_PAGE_GROUP_START	0
     81#define FIRST_PAGE_GROUP_END	0x100000
     82
     83#define P3P_MAX_MTU                     (9600)
     84#define P3P_MIN_MTU                     (68)
     85#define QLCNIC_MAX_ETHERHDR                32 /* This contains some padding */
     86
     87#define QLCNIC_P3P_RX_BUF_MAX_LEN         (QLCNIC_MAX_ETHERHDR + ETH_DATA_LEN)
     88#define QLCNIC_P3P_RX_JUMBO_BUF_MAX_LEN   (QLCNIC_MAX_ETHERHDR + P3P_MAX_MTU)
     89#define QLCNIC_CT_DEFAULT_RX_BUF_LEN	2048
     90#define QLCNIC_LRO_BUFFER_EXTRA		2048
     91
     92/* Tx defines */
     93#define QLCNIC_MAX_FRAGS_PER_TX	14
     94#define MAX_TSO_HEADER_DESC	2
     95#define MGMT_CMD_DESC_RESV	4
     96#define TX_STOP_THRESH		((MAX_SKB_FRAGS >> 2) + MAX_TSO_HEADER_DESC \
     97							+ MGMT_CMD_DESC_RESV)
     98#define QLCNIC_MAX_TX_TIMEOUTS	2
     99
    100/* Driver will use 1 Tx ring in INT-x/MSI/SRIOV mode. */
    101#define QLCNIC_SINGLE_RING		1
    102#define QLCNIC_DEF_SDS_RINGS		4
    103#define QLCNIC_DEF_TX_RINGS		4
    104#define QLCNIC_MAX_VNIC_TX_RINGS	4
    105#define QLCNIC_MAX_VNIC_SDS_RINGS	4
    106#define QLCNIC_83XX_MINIMUM_VECTOR	3
    107#define QLCNIC_82XX_MINIMUM_VECTOR	2
    108
    109enum qlcnic_queue_type {
    110	QLCNIC_TX_QUEUE = 1,
    111	QLCNIC_RX_QUEUE,
    112};
    113
    114/* Operational mode for driver */
    115#define QLCNIC_VNIC_MODE	0xFF
    116#define QLCNIC_DEFAULT_MODE	0x0
    117
    118/* Virtual NIC function count */
    119#define QLC_DEFAULT_VNIC_COUNT	8
    120#define QLC_84XX_VNIC_COUNT	16
    121
    122/*
    123 * Following are the states of the Phantom. Phantom will set them and
    124 * Host will read to check if the fields are correct.
    125 */
    126#define PHAN_INITIALIZE_FAILED		0xffff
    127#define PHAN_INITIALIZE_COMPLETE	0xff01
    128
    129/* Host writes the following to notify that it has done the init-handshake */
    130#define PHAN_INITIALIZE_ACK		0xf00f
    131#define PHAN_PEG_RCV_INITIALIZED	0xff01
    132
    133#define NUM_RCV_DESC_RINGS	3
    134
    135#define RCV_RING_NORMAL 0
    136#define RCV_RING_JUMBO	1
    137
    138#define MIN_CMD_DESCRIPTORS		64
    139#define MIN_RCV_DESCRIPTORS		64
    140#define MIN_JUMBO_DESCRIPTORS		32
    141
    142#define MAX_CMD_DESCRIPTORS		1024
    143#define MAX_RCV_DESCRIPTORS_1G		4096
    144#define MAX_RCV_DESCRIPTORS_10G 	8192
    145#define MAX_RCV_DESCRIPTORS_VF		2048
    146#define MAX_JUMBO_RCV_DESCRIPTORS_1G	512
    147#define MAX_JUMBO_RCV_DESCRIPTORS_10G	1024
    148
    149#define DEFAULT_RCV_DESCRIPTORS_1G	2048
    150#define DEFAULT_RCV_DESCRIPTORS_10G	4096
    151#define DEFAULT_RCV_DESCRIPTORS_VF	1024
    152#define MAX_RDS_RINGS                   2
    153
    154#define get_next_index(index, length)	\
    155	(((index) + 1) & ((length) - 1))
    156
    157/*
    158 * Following data structures describe the descriptors that will be used.
    159 * Added fileds of tcpHdrSize and ipHdrSize, The driver needs to do it only when
    160 * we are doing LSO (above the 1500 size packet) only.
    161 */
    162struct cmd_desc_type0 {
    163	u8 tcp_hdr_offset;	/* For LSO only */
    164	u8 ip_hdr_offset;	/* For LSO only */
    165	__le16 flags_opcode;	/* 15:13 unused, 12:7 opcode, 6:0 flags */
    166	__le32 nfrags__length;	/* 31:8 total len, 7:0 frag count */
    167
    168	__le64 addr_buffer2;
    169
    170	__le16 encap_descr;	/* 15:10 offset of outer L3 header,
    171				 * 9:6 number of 32bit words in outer L3 header,
    172				 * 5 offload outer L4 checksum,
    173				 * 4 offload outer L3 checksum,
    174				 * 3 Inner L4 type, TCP=0, UDP=1,
    175				 * 2 Inner L3 type, IPv4=0, IPv6=1,
    176				 * 1 Outer L3 type,IPv4=0, IPv6=1,
    177				 * 0 type of encapsulation, GRE=0, VXLAN=1
    178				 */
    179	__le16 mss;
    180	u8 port_ctxid;		/* 7:4 ctxid 3:0 port */
    181	u8 hdr_length;		/* LSO only : MAC+IP+TCP Hdr size */
    182	u8 outer_hdr_length;	/* Encapsulation only */
    183	u8 rsvd1;
    184
    185	__le64 addr_buffer3;
    186	__le64 addr_buffer1;
    187
    188	__le16 buffer_length[4];
    189
    190	__le64 addr_buffer4;
    191
    192	u8 eth_addr[ETH_ALEN];
    193	__le16 vlan_TCI;	/* In case of  encapsulation,
    194				 * this is for outer VLAN
    195				 */
    196
    197} __attribute__ ((aligned(64)));
    198
    199/* Note: sizeof(rcv_desc) should always be a mutliple of 2 */
    200struct rcv_desc {
    201	__le16 reference_handle;
    202	__le16 reserved;
    203	__le32 buffer_length;	/* allocated buffer length (usually 2K) */
    204	__le64 addr_buffer;
    205} __packed;
    206
    207struct status_desc {
    208	__le64 status_desc_data[2];
    209} __attribute__ ((aligned(16)));
    210
    211/* UNIFIED ROMIMAGE */
    212#define QLCNIC_UNI_FW_MIN_SIZE		0xc8000
    213#define QLCNIC_UNI_DIR_SECT_PRODUCT_TBL	0x0
    214#define QLCNIC_UNI_DIR_SECT_BOOTLD	0x6
    215#define QLCNIC_UNI_DIR_SECT_FW		0x7
    216
    217/*Offsets */
    218#define QLCNIC_UNI_CHIP_REV_OFF		10
    219#define QLCNIC_UNI_FLAGS_OFF		11
    220#define QLCNIC_UNI_BIOS_VERSION_OFF 	12
    221#define QLCNIC_UNI_BOOTLD_IDX_OFF	27
    222#define QLCNIC_UNI_FIRMWARE_IDX_OFF 	29
    223
    224struct uni_table_desc{
    225	__le32	findex;
    226	__le32	num_entries;
    227	__le32	entry_size;
    228	__le32	reserved[5];
    229};
    230
    231struct uni_data_desc{
    232	__le32	findex;
    233	__le32	size;
    234	__le32	reserved[5];
    235};
    236
    237/* Flash Defines and Structures */
    238#define QLCNIC_FLT_LOCATION	0x3F1000
    239#define QLCNIC_FDT_LOCATION     0x3F0000
    240#define QLCNIC_B0_FW_IMAGE_REGION 0x74
    241#define QLCNIC_C0_FW_IMAGE_REGION 0x97
    242#define QLCNIC_BOOTLD_REGION    0X72
    243struct qlcnic_flt_header {
    244	u16 version;
    245	u16 len;
    246	u16 checksum;
    247	u16 reserved;
    248};
    249
    250struct qlcnic_flt_entry {
    251	u8 region;
    252	u8 reserved0;
    253	u8 attrib;
    254	u8 reserved1;
    255	u32 size;
    256	u32 start_addr;
    257	u32 end_addr;
    258};
    259
    260/* Flash Descriptor Table */
    261struct qlcnic_fdt {
    262	u32	valid;
    263	u16	ver;
    264	u16	len;
    265	u16	cksum;
    266	u16	unused;
    267	u8	model[16];
    268	u8	mfg_id;
    269	u16	id;
    270	u8	flag;
    271	u8	erase_cmd;
    272	u8	alt_erase_cmd;
    273	u8	write_enable_cmd;
    274	u8	write_enable_bits;
    275	u8	write_statusreg_cmd;
    276	u8	unprotected_sec_cmd;
    277	u8	read_manuf_cmd;
    278	u32	block_size;
    279	u32	alt_block_size;
    280	u32	flash_size;
    281	u32	write_enable_data;
    282	u8	readid_addr_len;
    283	u8	write_disable_bits;
    284	u8	read_dev_id_len;
    285	u8	chip_erase_cmd;
    286	u16	read_timeo;
    287	u8	protected_sec_cmd;
    288	u8	resvd[65];
    289};
    290/* Magic number to let user know flash is programmed */
    291#define	QLCNIC_BDINFO_MAGIC 0x12345678
    292
    293#define QLCNIC_BRDTYPE_P3P_REF_QG	0x0021
    294#define QLCNIC_BRDTYPE_P3P_HMEZ		0x0022
    295#define QLCNIC_BRDTYPE_P3P_10G_CX4_LP	0x0023
    296#define QLCNIC_BRDTYPE_P3P_4_GB		0x0024
    297#define QLCNIC_BRDTYPE_P3P_IMEZ		0x0025
    298#define QLCNIC_BRDTYPE_P3P_10G_SFP_PLUS	0x0026
    299#define QLCNIC_BRDTYPE_P3P_10000_BASE_T	0x0027
    300#define QLCNIC_BRDTYPE_P3P_XG_LOM	0x0028
    301#define QLCNIC_BRDTYPE_P3P_4_GB_MM	0x0029
    302#define QLCNIC_BRDTYPE_P3P_10G_SFP_CT	0x002a
    303#define QLCNIC_BRDTYPE_P3P_10G_SFP_QT	0x002b
    304#define QLCNIC_BRDTYPE_P3P_10G_CX4	0x0031
    305#define QLCNIC_BRDTYPE_P3P_10G_XFP	0x0032
    306#define QLCNIC_BRDTYPE_P3P_10G_TP	0x0080
    307
    308#define QLCNIC_MSIX_TABLE_OFFSET	0x44
    309
    310/* Flash memory map */
    311#define QLCNIC_BRDCFG_START	0x4000		/* board config */
    312#define QLCNIC_BOOTLD_START	0x10000		/* bootld */
    313#define QLCNIC_IMAGE_START	0x43000		/* compressed image */
    314#define QLCNIC_USER_START	0x3E8000	/* Firmware info */
    315
    316#define QLCNIC_FW_VERSION_OFFSET	(QLCNIC_USER_START+0x408)
    317#define QLCNIC_FW_SIZE_OFFSET		(QLCNIC_USER_START+0x40c)
    318#define QLCNIC_FW_SERIAL_NUM_OFFSET	(QLCNIC_USER_START+0x81c)
    319#define QLCNIC_BIOS_VERSION_OFFSET	(QLCNIC_USER_START+0x83c)
    320
    321#define QLCNIC_BRDTYPE_OFFSET		(QLCNIC_BRDCFG_START+0x8)
    322#define QLCNIC_FW_MAGIC_OFFSET		(QLCNIC_BRDCFG_START+0x128)
    323
    324#define QLCNIC_FW_MIN_SIZE		(0x3fffff)
    325#define QLCNIC_UNIFIED_ROMIMAGE  	0
    326#define QLCNIC_FLASH_ROMIMAGE		1
    327#define QLCNIC_UNKNOWN_ROMIMAGE		0xff
    328
    329#define QLCNIC_UNIFIED_ROMIMAGE_NAME	"phanfw.bin"
    330#define QLCNIC_FLASH_ROMIMAGE_NAME	"flash"
    331
    332extern char qlcnic_driver_name[];
    333
    334extern int qlcnic_use_msi;
    335extern int qlcnic_use_msi_x;
    336extern int qlcnic_auto_fw_reset;
    337extern int qlcnic_load_fw_file;
    338
    339/* Number of status descriptors to handle per interrupt */
    340#define MAX_STATUS_HANDLE	(64)
    341
    342/*
    343 * qlcnic_skb_frag{} is to contain mapping info for each SG list. This
    344 * has to be freed when DMA is complete. This is part of qlcnic_tx_buffer{}.
    345 */
    346struct qlcnic_skb_frag {
    347	u64 dma;
    348	u64 length;
    349};
    350
    351/*    Following defines are for the state of the buffers    */
    352#define	QLCNIC_BUFFER_FREE	0
    353#define	QLCNIC_BUFFER_BUSY	1
    354
    355/*
    356 * There will be one qlcnic_buffer per skb packet.    These will be
    357 * used to save the dma info for pci_unmap_page()
    358 */
    359struct qlcnic_cmd_buffer {
    360	struct sk_buff *skb;
    361	struct qlcnic_skb_frag frag_array[MAX_SKB_FRAGS + 1];
    362	u32 frag_count;
    363};
    364
    365/* In rx_buffer, we do not need multiple fragments as is a single buffer */
    366struct qlcnic_rx_buffer {
    367	u16 ref_handle;
    368	struct sk_buff *skb;
    369	struct list_head list;
    370	u64 dma;
    371};
    372
    373/* Board types */
    374#define	QLCNIC_GBE	0x01
    375#define	QLCNIC_XGBE	0x02
    376
    377/*
    378 * Interrupt coalescing defaults. The defaults are for 1500 MTU. It is
    379 * adjusted based on configured MTU.
    380 */
    381#define QLCNIC_INTR_COAL_TYPE_RX		1
    382#define QLCNIC_INTR_COAL_TYPE_TX		2
    383#define QLCNIC_INTR_COAL_TYPE_RX_TX		3
    384
    385#define QLCNIC_DEF_INTR_COALESCE_RX_TIME_US	3
    386#define QLCNIC_DEF_INTR_COALESCE_RX_PACKETS	256
    387
    388#define QLCNIC_DEF_INTR_COALESCE_TX_TIME_US	64
    389#define QLCNIC_DEF_INTR_COALESCE_TX_PACKETS	64
    390
    391#define QLCNIC_INTR_DEFAULT			0x04
    392#define QLCNIC_CONFIG_INTR_COALESCE		3
    393#define QLCNIC_DEV_INFO_SIZE			2
    394
    395struct qlcnic_nic_intr_coalesce {
    396	u8	type;
    397	u8	sts_ring_mask;
    398	u16	rx_packets;
    399	u16	rx_time_us;
    400	u16	tx_packets;
    401	u16	tx_time_us;
    402	u16	flag;
    403	u32	timer_out;
    404};
    405
    406struct qlcnic_83xx_dump_template_hdr {
    407	u32	type;
    408	u32	offset;
    409	u32	size;
    410	u32	cap_mask;
    411	u32	num_entries;
    412	u32	version;
    413	u32	timestamp;
    414	u32	checksum;
    415	u32	drv_cap_mask;
    416	u32	sys_info[3];
    417	u32	saved_state[16];
    418	u32	cap_sizes[8];
    419	u32	ocm_wnd_reg[16];
    420	u32	rsvd[];
    421};
    422
    423struct qlcnic_82xx_dump_template_hdr {
    424	u32	type;
    425	u32	offset;
    426	u32	size;
    427	u32	cap_mask;
    428	u32	num_entries;
    429	u32	version;
    430	u32	timestamp;
    431	u32	checksum;
    432	u32	drv_cap_mask;
    433	u32	sys_info[3];
    434	u32	saved_state[16];
    435	u32	cap_sizes[8];
    436	u32	rsvd[7];
    437	u32	capabilities;
    438	u32	rsvd1[];
    439};
    440
    441#define QLC_PEX_DMA_READ_SIZE	(PAGE_SIZE * 16)
    442
    443struct qlcnic_fw_dump {
    444	u8	clr;	/* flag to indicate if dump is cleared */
    445	bool	enable; /* enable/disable dump */
    446	u32	size;	/* total size of the dump */
    447	u32	cap_mask; /* Current capture mask */
    448	void	*data;	/* dump data area */
    449	void	*tmpl_hdr;
    450	dma_addr_t phys_addr;
    451	void	*dma_buffer;
    452	bool	use_pex_dma;
    453	/* Read only elements which are common between 82xx and 83xx
    454	 * template header. Update these values immediately after we read
    455	 * template header from Firmware
    456	 */
    457	u32	tmpl_hdr_size;
    458	u32	version;
    459	u32	num_entries;
    460	u32	offset;
    461};
    462
    463/*
    464 * One hardware_context{} per adapter
    465 * contains interrupt info as well shared hardware info.
    466 */
    467struct qlcnic_hardware_context {
    468	void __iomem *pci_base0;
    469	void __iomem *ocm_win_crb;
    470
    471	unsigned long pci_len0;
    472
    473	rwlock_t crb_lock;
    474	struct mutex mem_lock;
    475
    476	u8 revision_id;
    477	u8 pci_func;
    478	u8 linkup;
    479	u8 loopback_state;
    480	u8 beacon_state;
    481	u8 has_link_events;
    482	u8 fw_type;
    483	u8 physical_port;
    484	u8 reset_context;
    485	u8 msix_supported;
    486	u8 max_mac_filters;
    487	u8 mc_enabled;
    488	u8 max_mc_count;
    489	u8 diag_test;
    490	u8 num_msix;
    491	u8 nic_mode;
    492	int diag_cnt;
    493
    494	u16 max_uc_count;
    495	u16 port_type;
    496	u16 board_type;
    497	u16 supported_type;
    498
    499	u32 link_speed;
    500	u16 link_duplex;
    501	u16 link_autoneg;
    502	u16 module_type;
    503
    504	u16 op_mode;
    505	u16 switch_mode;
    506	u16 max_tx_ques;
    507	u16 max_rx_ques;
    508	u16 max_mtu;
    509	u32 msg_enable;
    510	u16 total_nic_func;
    511	u16 max_pci_func;
    512	u32 max_vnic_func;
    513	u32 total_pci_func;
    514
    515	u32 capabilities;
    516	u32 extra_capability[3];
    517	u32 temp;
    518	u32 int_vec_bit;
    519	u32 fw_hal_version;
    520	u32 port_config;
    521	struct qlcnic_hardware_ops *hw_ops;
    522	struct qlcnic_nic_intr_coalesce coal;
    523	struct qlcnic_fw_dump fw_dump;
    524	struct qlcnic_fdt fdt;
    525	struct qlc_83xx_reset reset;
    526	struct qlc_83xx_idc idc;
    527	struct qlc_83xx_fw_info *fw_info;
    528	struct qlcnic_intrpt_config *intr_tbl;
    529	struct qlcnic_sriov *sriov;
    530	u32 *reg_tbl;
    531	u32 *ext_reg_tbl;
    532	u32 mbox_aen[QLC_83XX_MBX_AEN_CNT];
    533	u32 mbox_reg[4];
    534	struct qlcnic_mailbox *mailbox;
    535	u8 extend_lb_time;
    536	u8 phys_port_id[ETH_ALEN];
    537	u8 lb_mode;
    538	struct device *hwmon_dev;
    539	u32 post_mode;
    540	bool run_post;
    541};
    542
    543struct qlcnic_adapter_stats {
    544	u64  xmitcalled;
    545	u64  xmitfinished;
    546	u64  rxdropped;
    547	u64  txdropped;
    548	u64  csummed;
    549	u64  rx_pkts;
    550	u64  lro_pkts;
    551	u64  rxbytes;
    552	u64  txbytes;
    553	u64  lrobytes;
    554	u64  lso_frames;
    555	u64  encap_lso_frames;
    556	u64  encap_tx_csummed;
    557	u64  encap_rx_csummed;
    558	u64  xmit_on;
    559	u64  xmit_off;
    560	u64  skb_alloc_failure;
    561	u64  null_rxbuf;
    562	u64  rx_dma_map_error;
    563	u64  tx_dma_map_error;
    564	u64  spurious_intr;
    565	u64  mac_filter_limit_overrun;
    566	u64  mbx_spurious_intr;
    567};
    568
    569/*
    570 * Rcv Descriptor Context. One such per Rcv Descriptor. There may
    571 * be one Rcv Descriptor for normal packets, one for jumbo and may be others.
    572 */
    573struct qlcnic_host_rds_ring {
    574	void __iomem *crb_rcv_producer;
    575	struct rcv_desc *desc_head;
    576	struct qlcnic_rx_buffer *rx_buf_arr;
    577	u32 num_desc;
    578	u32 producer;
    579	u32 dma_size;
    580	u32 skb_size;
    581	u32 flags;
    582	struct list_head free_list;
    583	spinlock_t lock;
    584	dma_addr_t phys_addr;
    585} ____cacheline_internodealigned_in_smp;
    586
    587struct qlcnic_host_sds_ring {
    588	u32 consumer;
    589	u32 num_desc;
    590	void __iomem *crb_sts_consumer;
    591
    592	struct qlcnic_host_tx_ring *tx_ring;
    593	struct status_desc *desc_head;
    594	struct qlcnic_adapter *adapter;
    595	struct napi_struct napi;
    596	struct list_head free_list[NUM_RCV_DESC_RINGS];
    597
    598	void __iomem *crb_intr_mask;
    599	int irq;
    600
    601	dma_addr_t phys_addr;
    602	char name[IFNAMSIZ + 12];
    603} ____cacheline_internodealigned_in_smp;
    604
    605struct qlcnic_tx_queue_stats {
    606	u64 xmit_on;
    607	u64 xmit_off;
    608	u64 xmit_called;
    609	u64 xmit_finished;
    610	u64 tx_bytes;
    611};
    612
    613struct qlcnic_host_tx_ring {
    614	int irq;
    615	void __iomem *crb_intr_mask;
    616	char name[IFNAMSIZ + 12];
    617	u16 ctx_id;
    618
    619	u32 state;
    620	u32 producer;
    621	u32 sw_consumer;
    622	u32 num_desc;
    623
    624	struct qlcnic_tx_queue_stats tx_stats;
    625
    626	void __iomem *crb_cmd_producer;
    627	struct cmd_desc_type0 *desc_head;
    628	struct qlcnic_adapter *adapter;
    629	struct napi_struct napi;
    630	struct qlcnic_cmd_buffer *cmd_buf_arr;
    631	__le32 *hw_consumer;
    632
    633	dma_addr_t phys_addr;
    634	dma_addr_t hw_cons_phys_addr;
    635	struct netdev_queue *txq;
    636	/* Lock to protect Tx descriptors cleanup */
    637	spinlock_t tx_clean_lock;
    638} ____cacheline_internodealigned_in_smp;
    639
    640/*
    641 * Receive context. There is one such structure per instance of the
    642 * receive processing. Any state information that is relevant to
    643 * the receive, and is must be in this structure. The global data may be
    644 * present elsewhere.
    645 */
    646struct qlcnic_recv_context {
    647	struct qlcnic_host_rds_ring *rds_rings;
    648	struct qlcnic_host_sds_ring *sds_rings;
    649	u32 state;
    650	u16 context_id;
    651	u16 virt_port;
    652};
    653
    654/* HW context creation */
    655
    656#define QLCNIC_OS_CRB_RETRY_COUNT	4000
    657
    658#define QLCNIC_CDRP_CMD_BIT		0x80000000
    659
    660/*
    661 * All responses must have the QLCNIC_CDRP_CMD_BIT cleared
    662 * in the crb QLCNIC_CDRP_CRB_OFFSET.
    663 */
    664#define QLCNIC_CDRP_FORM_RSP(rsp)	(rsp)
    665#define QLCNIC_CDRP_IS_RSP(rsp)	(((rsp) & QLCNIC_CDRP_CMD_BIT) == 0)
    666
    667#define QLCNIC_CDRP_RSP_OK		0x00000001
    668#define QLCNIC_CDRP_RSP_FAIL		0x00000002
    669#define QLCNIC_CDRP_RSP_TIMEOUT 	0x00000003
    670
    671/*
    672 * All commands must have the QLCNIC_CDRP_CMD_BIT set in
    673 * the crb QLCNIC_CDRP_CRB_OFFSET.
    674 */
    675#define QLCNIC_CDRP_FORM_CMD(cmd)	(QLCNIC_CDRP_CMD_BIT | (cmd))
    676
    677#define QLCNIC_RCODE_SUCCESS		0
    678#define QLCNIC_RCODE_INVALID_ARGS	6
    679#define QLCNIC_RCODE_NOT_SUPPORTED	9
    680#define QLCNIC_RCODE_NOT_PERMITTED	10
    681#define QLCNIC_RCODE_NOT_IMPL		15
    682#define QLCNIC_RCODE_INVALID		16
    683#define QLCNIC_RCODE_TIMEOUT		17
    684#define QLCNIC_DESTROY_CTX_RESET	0
    685
    686/*
    687 * Capabilities Announced
    688 */
    689#define QLCNIC_CAP0_LEGACY_CONTEXT	(1)
    690#define QLCNIC_CAP0_LEGACY_MN		(1 << 2)
    691#define QLCNIC_CAP0_LSO 		(1 << 6)
    692#define QLCNIC_CAP0_JUMBO_CONTIGUOUS	(1 << 7)
    693#define QLCNIC_CAP0_LRO_CONTIGUOUS	(1 << 8)
    694#define QLCNIC_CAP0_VALIDOFF		(1 << 11)
    695#define QLCNIC_CAP0_LRO_MSS		(1 << 21)
    696#define QLCNIC_CAP0_TX_MULTI		(1 << 22)
    697
    698/*
    699 * Context state
    700 */
    701#define QLCNIC_HOST_CTX_STATE_FREED	0
    702#define QLCNIC_HOST_CTX_STATE_ACTIVE	2
    703
    704/*
    705 * Rx context
    706 */
    707
    708struct qlcnic_hostrq_sds_ring {
    709	__le64 host_phys_addr;	/* Ring base addr */
    710	__le32 ring_size;		/* Ring entries */
    711	__le16 msi_index;
    712	__le16 rsvd;		/* Padding */
    713} __packed;
    714
    715struct qlcnic_hostrq_rds_ring {
    716	__le64 host_phys_addr;	/* Ring base addr */
    717	__le64 buff_size;		/* Packet buffer size */
    718	__le32 ring_size;		/* Ring entries */
    719	__le32 ring_kind;		/* Class of ring */
    720} __packed;
    721
    722struct qlcnic_hostrq_rx_ctx {
    723	__le64 host_rsp_dma_addr;	/* Response dma'd here */
    724	__le32 capabilities[4];		/* Flag bit vector */
    725	__le32 host_int_crb_mode;	/* Interrupt crb usage */
    726	__le32 host_rds_crb_mode;	/* RDS crb usage */
    727	/* These ring offsets are relative to data[0] below */
    728	__le32 rds_ring_offset;	/* Offset to RDS config */
    729	__le32 sds_ring_offset;	/* Offset to SDS config */
    730	__le16 num_rds_rings;	/* Count of RDS rings */
    731	__le16 num_sds_rings;	/* Count of SDS rings */
    732	__le16 valid_field_offset;
    733	u8  txrx_sds_binding;
    734	u8  msix_handler;
    735	u8  reserved[128];      /* reserve space for future expansion*/
    736	/* MUST BE 64-bit aligned.
    737	   The following is packed:
    738	   - N hostrq_rds_rings
    739	   - N hostrq_sds_rings */
    740	char data[];
    741} __packed;
    742
    743struct qlcnic_cardrsp_rds_ring{
    744	__le32 host_producer_crb;	/* Crb to use */
    745	__le32 rsvd1;		/* Padding */
    746} __packed;
    747
    748struct qlcnic_cardrsp_sds_ring {
    749	__le32 host_consumer_crb;	/* Crb to use */
    750	__le32 interrupt_crb;	/* Crb to use */
    751} __packed;
    752
    753struct qlcnic_cardrsp_rx_ctx {
    754	/* These ring offsets are relative to data[0] below */
    755	__le32 rds_ring_offset;	/* Offset to RDS config */
    756	__le32 sds_ring_offset;	/* Offset to SDS config */
    757	__le32 host_ctx_state;	/* Starting State */
    758	__le32 num_fn_per_port;	/* How many PCI fn share the port */
    759	__le16 num_rds_rings;	/* Count of RDS rings */
    760	__le16 num_sds_rings;	/* Count of SDS rings */
    761	__le16 context_id;		/* Handle for context */
    762	u8  phys_port;		/* Physical id of port */
    763	u8  virt_port;		/* Virtual/Logical id of port */
    764	u8  reserved[128];	/* save space for future expansion */
    765	/*  MUST BE 64-bit aligned.
    766	   The following is packed:
    767	   - N cardrsp_rds_rings
    768	   - N cardrs_sds_rings */
    769	char data[];
    770} __packed;
    771
    772#define SIZEOF_HOSTRQ_RX(HOSTRQ_RX, rds_rings, sds_rings)	\
    773	(sizeof(HOSTRQ_RX) + 					\
    774	(rds_rings)*(sizeof(struct qlcnic_hostrq_rds_ring)) +		\
    775	(sds_rings)*(sizeof(struct qlcnic_hostrq_sds_ring)))
    776
    777#define SIZEOF_CARDRSP_RX(CARDRSP_RX, rds_rings, sds_rings) 	\
    778	(sizeof(CARDRSP_RX) + 					\
    779	(rds_rings)*(sizeof(struct qlcnic_cardrsp_rds_ring)) + 		\
    780	(sds_rings)*(sizeof(struct qlcnic_cardrsp_sds_ring)))
    781
    782/*
    783 * Tx context
    784 */
    785
    786struct qlcnic_hostrq_cds_ring {
    787	__le64 host_phys_addr;	/* Ring base addr */
    788	__le32 ring_size;		/* Ring entries */
    789	__le32 rsvd;		/* Padding */
    790} __packed;
    791
    792struct qlcnic_hostrq_tx_ctx {
    793	__le64 host_rsp_dma_addr;	/* Response dma'd here */
    794	__le64 cmd_cons_dma_addr;	/*  */
    795	__le64 dummy_dma_addr;	/*  */
    796	__le32 capabilities[4];	/* Flag bit vector */
    797	__le32 host_int_crb_mode;	/* Interrupt crb usage */
    798	__le32 rsvd1;		/* Padding */
    799	__le16 rsvd2;		/* Padding */
    800	__le16 interrupt_ctl;
    801	__le16 msi_index;
    802	__le16 rsvd3;		/* Padding */
    803	struct qlcnic_hostrq_cds_ring cds_ring;	/* Desc of cds ring */
    804	u8  reserved[128];	/* future expansion */
    805} __packed;
    806
    807struct qlcnic_cardrsp_cds_ring {
    808	__le32 host_producer_crb;	/* Crb to use */
    809	__le32 interrupt_crb;	/* Crb to use */
    810} __packed;
    811
    812struct qlcnic_cardrsp_tx_ctx {
    813	__le32 host_ctx_state;	/* Starting state */
    814	__le16 context_id;		/* Handle for context */
    815	u8  phys_port;		/* Physical id of port */
    816	u8  virt_port;		/* Virtual/Logical id of port */
    817	struct qlcnic_cardrsp_cds_ring cds_ring;	/* Card cds settings */
    818	u8  reserved[128];	/* future expansion */
    819} __packed;
    820
    821#define SIZEOF_HOSTRQ_TX(HOSTRQ_TX)	(sizeof(HOSTRQ_TX))
    822#define SIZEOF_CARDRSP_TX(CARDRSP_TX)	(sizeof(CARDRSP_TX))
    823
    824/* CRB */
    825
    826#define QLCNIC_HOST_RDS_CRB_MODE_UNIQUE	0
    827#define QLCNIC_HOST_RDS_CRB_MODE_SHARED	1
    828#define QLCNIC_HOST_RDS_CRB_MODE_CUSTOM	2
    829#define QLCNIC_HOST_RDS_CRB_MODE_MAX	3
    830
    831#define QLCNIC_HOST_INT_CRB_MODE_UNIQUE	0
    832#define QLCNIC_HOST_INT_CRB_MODE_SHARED	1
    833#define QLCNIC_HOST_INT_CRB_MODE_NORX	2
    834#define QLCNIC_HOST_INT_CRB_MODE_NOTX	3
    835#define QLCNIC_HOST_INT_CRB_MODE_NORXTX	4
    836
    837
    838/* MAC */
    839
    840#define MC_COUNT_P3P	38
    841
    842#define QLCNIC_MAC_NOOP	0
    843#define QLCNIC_MAC_ADD	1
    844#define QLCNIC_MAC_DEL	2
    845#define QLCNIC_MAC_VLAN_ADD	3
    846#define QLCNIC_MAC_VLAN_DEL	4
    847
    848enum qlcnic_mac_type {
    849	QLCNIC_UNICAST_MAC,
    850	QLCNIC_MULTICAST_MAC,
    851	QLCNIC_BROADCAST_MAC,
    852};
    853
    854struct qlcnic_mac_vlan_list {
    855	struct list_head list;
    856	uint8_t mac_addr[ETH_ALEN+2];
    857	u16 vlan_id;
    858	enum qlcnic_mac_type mac_type;
    859};
    860
    861/* MAC Learn */
    862#define NO_MAC_LEARN		0
    863#define DRV_MAC_LEARN		1
    864#define FDB_MAC_LEARN		2
    865
    866#define QLCNIC_HOST_REQUEST	0x13
    867#define QLCNIC_REQUEST		0x14
    868
    869#define QLCNIC_MAC_EVENT	0x1
    870
    871#define QLCNIC_IP_UP		2
    872#define QLCNIC_IP_DOWN		3
    873
    874#define QLCNIC_ILB_MODE		0x1
    875#define QLCNIC_ELB_MODE		0x2
    876#define QLCNIC_LB_MODE_MASK	0x3
    877
    878#define QLCNIC_LINKEVENT	0x1
    879#define QLCNIC_LB_RESPONSE	0x2
    880#define QLCNIC_IS_LB_CONFIGURED(VAL)	\
    881		(VAL == (QLCNIC_LINKEVENT | QLCNIC_LB_RESPONSE))
    882
    883/*
    884 * Driver --> Firmware
    885 */
    886#define QLCNIC_H2C_OPCODE_CONFIG_RSS			0x1
    887#define QLCNIC_H2C_OPCODE_CONFIG_INTR_COALESCE		0x3
    888#define QLCNIC_H2C_OPCODE_CONFIG_LED			0x4
    889#define QLCNIC_H2C_OPCODE_LRO_REQUEST			0x7
    890#define QLCNIC_H2C_OPCODE_SET_MAC_RECEIVE_MODE		0xc
    891#define QLCNIC_H2C_OPCODE_CONFIG_IPADDR		0x12
    892
    893#define QLCNIC_H2C_OPCODE_GET_LINKEVENT		0x15
    894#define QLCNIC_H2C_OPCODE_CONFIG_BRIDGING		0x17
    895#define QLCNIC_H2C_OPCODE_CONFIG_HW_LRO		0x18
    896#define QLCNIC_H2C_OPCODE_CONFIG_LOOPBACK		0x13
    897
    898/*
    899 * Firmware --> Driver
    900 */
    901
    902#define QLCNIC_C2H_OPCODE_CONFIG_LOOPBACK		0x8f
    903#define QLCNIC_C2H_OPCODE_GET_LINKEVENT_RESPONSE	0x8D
    904#define QLCNIC_C2H_OPCODE_GET_DCB_AEN			0x90
    905
    906#define VPORT_MISS_MODE_DROP		0 /* drop all unmatched */
    907#define VPORT_MISS_MODE_ACCEPT_ALL	1 /* accept all packets */
    908#define VPORT_MISS_MODE_ACCEPT_MULTI	2 /* accept unmatched multicast */
    909
    910#define QLCNIC_LRO_REQUEST_CLEANUP	4
    911
    912/* Capabilites received */
    913#define QLCNIC_FW_CAPABILITY_TSO		BIT_1
    914#define QLCNIC_FW_CAPABILITY_BDG		BIT_8
    915#define QLCNIC_FW_CAPABILITY_FVLANTX		BIT_9
    916#define QLCNIC_FW_CAPABILITY_HW_LRO		BIT_10
    917#define QLCNIC_FW_CAPABILITY_2_MULTI_TX		BIT_4
    918#define QLCNIC_FW_CAPABILITY_MULTI_LOOPBACK	BIT_27
    919#define QLCNIC_FW_CAPABILITY_MORE_CAPS		BIT_31
    920
    921#define QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG	BIT_2
    922#define QLCNIC_FW_CAP2_HW_LRO_IPV6		BIT_3
    923#define QLCNIC_FW_CAPABILITY_SET_DRV_VER	BIT_5
    924#define QLCNIC_FW_CAPABILITY_2_BEACON		BIT_7
    925#define QLCNIC_FW_CAPABILITY_2_PER_PORT_ESWITCH_CFG	BIT_9
    926#define QLCNIC_FW_CAPABILITY_2_EXT_ISCSI_DUMP	BIT_13
    927
    928#define QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD	BIT_0
    929#define QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD	BIT_1
    930#define QLCNIC_83XX_FW_CAPAB_ENCAP_CKO_OFFLOAD	BIT_4
    931
    932/* module types */
    933#define LINKEVENT_MODULE_NOT_PRESENT			1
    934#define LINKEVENT_MODULE_OPTICAL_UNKNOWN		2
    935#define LINKEVENT_MODULE_OPTICAL_SRLR			3
    936#define LINKEVENT_MODULE_OPTICAL_LRM			4
    937#define LINKEVENT_MODULE_OPTICAL_SFP_1G 		5
    938#define LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE	6
    939#define LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN	7
    940#define LINKEVENT_MODULE_TWINAX 			8
    941
    942#define LINKSPEED_10GBPS	10000
    943#define LINKSPEED_1GBPS 	1000
    944#define LINKSPEED_100MBPS	100
    945#define LINKSPEED_10MBPS	10
    946
    947#define LINKSPEED_ENCODED_10MBPS	0
    948#define LINKSPEED_ENCODED_100MBPS	1
    949#define LINKSPEED_ENCODED_1GBPS 	2
    950
    951#define LINKEVENT_AUTONEG_DISABLED	0
    952#define LINKEVENT_AUTONEG_ENABLED	1
    953
    954#define LINKEVENT_HALF_DUPLEX		0
    955#define LINKEVENT_FULL_DUPLEX		1
    956
    957#define LINKEVENT_LINKSPEED_MBPS	0
    958#define LINKEVENT_LINKSPEED_ENCODED	1
    959
    960/* firmware response header:
    961 *	63:58 - message type
    962 *	57:56 - owner
    963 *	55:53 - desc count
    964 *	52:48 - reserved
    965 *	47:40 - completion id
    966 *	39:32 - opcode
    967 *	31:16 - error code
    968 *	15:00 - reserved
    969 */
    970#define qlcnic_get_nic_msg_opcode(msg_hdr)	\
    971	((msg_hdr >> 32) & 0xFF)
    972
    973struct qlcnic_fw_msg {
    974	union {
    975		struct {
    976			u64 hdr;
    977			u64 body[7];
    978		};
    979		u64 words[8];
    980	};
    981};
    982
    983struct qlcnic_nic_req {
    984	__le64 qhdr;
    985	__le64 req_hdr;
    986	__le64 words[6];
    987} __packed;
    988
    989struct qlcnic_mac_req {
    990	u8 op;
    991	u8 tag;
    992	u8 mac_addr[6];
    993};
    994
    995struct qlcnic_vlan_req {
    996	__le16 vlan_id;
    997	__le16 rsvd[3];
    998} __packed;
    999
   1000struct qlcnic_ipaddr {
   1001	__be32 ipv4;
   1002	__be32 ipv6[4];
   1003};
   1004
   1005#define QLCNIC_MSI_ENABLED		0x02
   1006#define QLCNIC_MSIX_ENABLED		0x04
   1007#define QLCNIC_LRO_ENABLED		0x01
   1008#define QLCNIC_LRO_DISABLED		0x00
   1009#define QLCNIC_BRIDGE_ENABLED       	0X10
   1010#define QLCNIC_DIAG_ENABLED		0x20
   1011#define QLCNIC_ESWITCH_ENABLED		0x40
   1012#define QLCNIC_ADAPTER_INITIALIZED	0x80
   1013#define QLCNIC_TAGGING_ENABLED		0x100
   1014#define QLCNIC_MACSPOOF			0x200
   1015#define QLCNIC_MAC_OVERRIDE_DISABLED	0x400
   1016#define QLCNIC_PROMISC_DISABLED		0x800
   1017#define QLCNIC_NEED_FLR			0x1000
   1018#define QLCNIC_FW_RESET_OWNER		0x2000
   1019#define QLCNIC_FW_HANG			0x4000
   1020#define QLCNIC_FW_LRO_MSS_CAP		0x8000
   1021#define QLCNIC_TX_INTR_SHARED		0x10000
   1022#define QLCNIC_APP_CHANGED_FLAGS	0x20000
   1023#define QLCNIC_HAS_PHYS_PORT_ID		0x40000
   1024#define QLCNIC_TSS_RSS			0x80000
   1025
   1026#define QLCNIC_VLAN_FILTERING		0x800000
   1027
   1028#define QLCNIC_IS_MSI_FAMILY(adapter) \
   1029	((adapter)->flags & (QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED))
   1030#define QLCNIC_IS_TSO_CAPABLE(adapter)  \
   1031	((adapter)->ahw->capabilities & QLCNIC_FW_CAPABILITY_TSO)
   1032
   1033#define QLCNIC_BEACON_EANBLE		0xC
   1034#define QLCNIC_BEACON_DISABLE		0xD
   1035
   1036#define QLCNIC_BEACON_ON		2
   1037#define QLCNIC_BEACON_OFF		0
   1038
   1039#define QLCNIC_MSIX_TBL_SPACE		8192
   1040#define QLCNIC_PCI_REG_MSIX_TBL 	0x44
   1041#define QLCNIC_MSIX_TBL_PGSIZE		4096
   1042
   1043#define QLCNIC_ADAPTER_UP_MAGIC 777
   1044
   1045#define __QLCNIC_FW_ATTACHED		0
   1046#define __QLCNIC_DEV_UP 		1
   1047#define __QLCNIC_RESETTING		2
   1048#define __QLCNIC_START_FW 		4
   1049#define __QLCNIC_AER			5
   1050#define __QLCNIC_DIAG_RES_ALLOC		6
   1051#define __QLCNIC_LED_ENABLE		7
   1052#define __QLCNIC_ELB_INPROGRESS		8
   1053#define __QLCNIC_MULTI_TX_UNIQUE	9
   1054#define __QLCNIC_SRIOV_ENABLE		10
   1055#define __QLCNIC_SRIOV_CAPABLE		11
   1056#define __QLCNIC_MBX_POLL_ENABLE	12
   1057#define __QLCNIC_DIAG_MODE		13
   1058#define __QLCNIC_MAINTENANCE_MODE	16
   1059
   1060#define QLCNIC_INTERRUPT_TEST		1
   1061#define QLCNIC_LOOPBACK_TEST		2
   1062#define QLCNIC_LED_TEST		3
   1063
   1064#define QLCNIC_FILTER_AGE	80
   1065#define QLCNIC_READD_AGE	20
   1066#define QLCNIC_LB_MAX_FILTERS	64
   1067#define QLCNIC_LB_BUCKET_SIZE	32
   1068#define QLCNIC_ILB_MAX_RCV_LOOP	10
   1069
   1070struct qlcnic_filter {
   1071	struct hlist_node fnode;
   1072	u8 faddr[ETH_ALEN];
   1073	u16 vlan_id;
   1074	unsigned long ftime;
   1075};
   1076
   1077struct qlcnic_filter_hash {
   1078	struct hlist_head *fhead;
   1079	u8 fnum;
   1080	u16 fmax;
   1081	u16 fbucket_size;
   1082};
   1083
   1084/* Mailbox specific data structures */
   1085struct qlcnic_mailbox {
   1086	struct workqueue_struct	*work_q;
   1087	struct qlcnic_adapter	*adapter;
   1088	const struct qlcnic_mbx_ops *ops;
   1089	struct work_struct	work;
   1090	struct completion	completion;
   1091	struct list_head	cmd_q;
   1092	unsigned long		status;
   1093	spinlock_t		queue_lock;	/* Mailbox queue lock */
   1094	spinlock_t		aen_lock;	/* Mailbox response/AEN lock */
   1095	u32			rsp_status;
   1096	u32			num_cmds;
   1097};
   1098
   1099struct qlcnic_adapter {
   1100	struct qlcnic_hardware_context *ahw;
   1101	struct qlcnic_recv_context *recv_ctx;
   1102	struct qlcnic_host_tx_ring *tx_ring;
   1103	struct net_device *netdev;
   1104	struct pci_dev *pdev;
   1105
   1106	unsigned long state;
   1107	u32 flags;
   1108
   1109	u16 num_txd;
   1110	u16 num_rxd;
   1111	u16 num_jumbo_rxd;
   1112	u16 max_rxd;
   1113	u16 max_jumbo_rxd;
   1114
   1115	u8 max_rds_rings;
   1116
   1117	u8 max_sds_rings; /* max sds rings supported by adapter */
   1118	u8 max_tx_rings;  /* max tx rings supported by adapter */
   1119
   1120	u8 drv_tx_rings;  /* max tx rings supported by driver */
   1121	u8 drv_sds_rings; /* max sds rings supported by driver */
   1122
   1123	u8 drv_tss_rings; /* tss ring input */
   1124	u8 drv_rss_rings; /* rss ring input */
   1125
   1126	u8 rx_csum;
   1127	u8 portnum;
   1128
   1129	u8 fw_wait_cnt;
   1130	u8 fw_fail_cnt;
   1131	u8 tx_timeo_cnt;
   1132	u8 need_fw_reset;
   1133	u8 reset_ctx_cnt;
   1134
   1135	u16 is_up;
   1136	u16 rx_pvid;
   1137	u16 tx_pvid;
   1138
   1139	u32 irq;
   1140	u32 heartbeat;
   1141
   1142	u8 dev_state;
   1143	u8 reset_ack_timeo;
   1144	u8 dev_init_timeo;
   1145
   1146	u8 mac_addr[ETH_ALEN];
   1147
   1148	u64 dev_rst_time;
   1149	bool drv_mac_learn;
   1150	bool fdb_mac_learn;
   1151	bool rx_mac_learn;
   1152	unsigned long vlans[BITS_TO_LONGS(VLAN_N_VID)];
   1153	u8 flash_mfg_id;
   1154	struct qlcnic_npar_info *npars;
   1155	struct qlcnic_eswitch *eswitch;
   1156	struct qlcnic_nic_template *nic_ops;
   1157
   1158	struct qlcnic_adapter_stats stats;
   1159	struct list_head mac_list;
   1160
   1161	void __iomem	*tgt_mask_reg;
   1162	void __iomem	*tgt_status_reg;
   1163	void __iomem	*crb_int_state_reg;
   1164	void __iomem	*isr_int_vec;
   1165
   1166	struct msix_entry *msix_entries;
   1167	struct workqueue_struct *qlcnic_wq;
   1168	struct delayed_work fw_work;
   1169	struct delayed_work idc_aen_work;
   1170	struct delayed_work mbx_poll_work;
   1171	struct qlcnic_dcb *dcb;
   1172
   1173	struct qlcnic_filter_hash fhash;
   1174	struct qlcnic_filter_hash rx_fhash;
   1175	struct list_head vf_mc_list;
   1176
   1177	spinlock_t mac_learn_lock;
   1178	/* spinlock for catching rcv filters for eswitch traffic */
   1179	spinlock_t rx_mac_learn_lock;
   1180	u32 file_prd_off;	/*File fw product offset*/
   1181	u32 fw_version;
   1182	u32 offload_flags;
   1183	const struct firmware *fw;
   1184};
   1185
   1186struct qlcnic_info_le {
   1187	__le16	pci_func;
   1188	__le16	op_mode;	/* 1 = Priv, 2 = NP, 3 = NP passthru */
   1189	__le16	phys_port;
   1190	__le16	switch_mode;	/* 0 = disabled, 1 = int, 2 = ext */
   1191
   1192	__le32	capabilities;
   1193	u8	max_mac_filters;
   1194	u8	reserved1;
   1195	__le16	max_mtu;
   1196
   1197	__le16	max_tx_ques;
   1198	__le16	max_rx_ques;
   1199	__le16	min_tx_bw;
   1200	__le16	max_tx_bw;
   1201	__le32  op_type;
   1202	__le16  max_bw_reg_offset;
   1203	__le16  max_linkspeed_reg_offset;
   1204	__le32  capability1;
   1205	__le32  capability2;
   1206	__le32  capability3;
   1207	__le16  max_tx_mac_filters;
   1208	__le16  max_rx_mcast_mac_filters;
   1209	__le16  max_rx_ucast_mac_filters;
   1210	__le16  max_rx_ip_addr;
   1211	__le16  max_rx_lro_flow;
   1212	__le16  max_rx_status_rings;
   1213	__le16  max_rx_buf_rings;
   1214	__le16  max_tx_vlan_keys;
   1215	u8      total_pf;
   1216	u8      total_rss_engines;
   1217	__le16  max_vports;
   1218	__le16	linkstate_reg_offset;
   1219	__le16	bit_offsets;
   1220	__le16  max_local_ipv6_addrs;
   1221	__le16  max_remote_ipv6_addrs;
   1222	u8	reserved2[56];
   1223} __packed;
   1224
   1225struct qlcnic_info {
   1226	u16	pci_func;
   1227	u16	op_mode;
   1228	u16	phys_port;
   1229	u16	switch_mode;
   1230	u32	capabilities;
   1231	u8	max_mac_filters;
   1232	u16	max_mtu;
   1233	u16	max_tx_ques;
   1234	u16	max_rx_ques;
   1235	u16	min_tx_bw;
   1236	u16	max_tx_bw;
   1237	u32	op_type;
   1238	u16	max_bw_reg_offset;
   1239	u16	max_linkspeed_reg_offset;
   1240	u32	capability1;
   1241	u32	capability2;
   1242	u32	capability3;
   1243	u16	max_tx_mac_filters;
   1244	u16	max_rx_mcast_mac_filters;
   1245	u16	max_rx_ucast_mac_filters;
   1246	u16	max_rx_ip_addr;
   1247	u16	max_rx_lro_flow;
   1248	u16	max_rx_status_rings;
   1249	u16	max_rx_buf_rings;
   1250	u16	max_tx_vlan_keys;
   1251	u8      total_pf;
   1252	u8      total_rss_engines;
   1253	u16	max_vports;
   1254	u16	linkstate_reg_offset;
   1255	u16	bit_offsets;
   1256	u16	max_local_ipv6_addrs;
   1257	u16	max_remote_ipv6_addrs;
   1258};
   1259
   1260struct qlcnic_pci_info_le {
   1261	__le16	id;		/* pci function id */
   1262	__le16	active;		/* 1 = Enabled */
   1263	__le16	type;		/* 1 = NIC, 2 = FCoE, 3 = iSCSI */
   1264	__le16	default_port;	/* default port number */
   1265
   1266	__le16	tx_min_bw;	/* Multiple of 100mbpc */
   1267	__le16	tx_max_bw;
   1268	__le16	reserved1[2];
   1269
   1270	u8	mac[ETH_ALEN];
   1271	__le16  func_count;
   1272	u8      reserved2[104];
   1273
   1274} __packed;
   1275
   1276struct qlcnic_pci_info {
   1277	u16	id;
   1278	u16	active;
   1279	u16	type;
   1280	u16	default_port;
   1281	u16	tx_min_bw;
   1282	u16	tx_max_bw;
   1283	u8	mac[ETH_ALEN];
   1284	u16  func_count;
   1285};
   1286
   1287struct qlcnic_npar_info {
   1288	bool	eswitch_status;
   1289	u16	pvid;
   1290	u16	min_bw;
   1291	u16	max_bw;
   1292	u8	phy_port;
   1293	u8	type;
   1294	u8	active;
   1295	u8	enable_pm;
   1296	u8	dest_npar;
   1297	u8	discard_tagged;
   1298	u8	mac_override;
   1299	u8	mac_anti_spoof;
   1300	u8	promisc_mode;
   1301	u8	offload_flags;
   1302	u8      pci_func;
   1303	u8      mac[ETH_ALEN];
   1304};
   1305
   1306struct qlcnic_eswitch {
   1307	u8	port;
   1308	u8	active_vports;
   1309	u8	active_vlans;
   1310	u8	active_ucast_filters;
   1311	u8	max_ucast_filters;
   1312	u8	max_active_vlans;
   1313
   1314	u32	flags;
   1315#define QLCNIC_SWITCH_ENABLE		BIT_1
   1316#define QLCNIC_SWITCH_VLAN_FILTERING	BIT_2
   1317#define QLCNIC_SWITCH_PROMISC_MODE	BIT_3
   1318#define QLCNIC_SWITCH_PORT_MIRRORING	BIT_4
   1319};
   1320
   1321
   1322#define MAX_BW			100	/* % of link speed */
   1323#define MIN_BW			1	/* % of link speed */
   1324#define MAX_VLAN_ID		4095
   1325#define MIN_VLAN_ID		2
   1326#define DEFAULT_MAC_LEARN	1
   1327
   1328#define IS_VALID_VLAN(vlan)	(vlan >= MIN_VLAN_ID && vlan < MAX_VLAN_ID)
   1329#define IS_VALID_BW(bw)		(bw <= MAX_BW)
   1330
   1331struct qlcnic_pci_func_cfg {
   1332	u16	func_type;
   1333	u16	min_bw;
   1334	u16	max_bw;
   1335	u16	port_num;
   1336	u8	pci_func;
   1337	u8	func_state;
   1338	u8	def_mac_addr[ETH_ALEN];
   1339};
   1340
   1341struct qlcnic_npar_func_cfg {
   1342	u32	fw_capab;
   1343	u16	port_num;
   1344	u16	min_bw;
   1345	u16	max_bw;
   1346	u16	max_tx_queues;
   1347	u16	max_rx_queues;
   1348	u8	pci_func;
   1349	u8	op_mode;
   1350};
   1351
   1352struct qlcnic_pm_func_cfg {
   1353	u8	pci_func;
   1354	u8	action;
   1355	u8	dest_npar;
   1356	u8	reserved[5];
   1357};
   1358
   1359struct qlcnic_esw_func_cfg {
   1360	u16	vlan_id;
   1361	u8	op_mode;
   1362	u8	op_type;
   1363	u8	pci_func;
   1364	u8	host_vlan_tag;
   1365	u8	promisc_mode;
   1366	u8	discard_tagged;
   1367	u8	mac_override;
   1368	u8	mac_anti_spoof;
   1369	u8	offload_flags;
   1370	u8	reserved[5];
   1371};
   1372
   1373#define QLCNIC_STATS_VERSION		1
   1374#define QLCNIC_STATS_PORT		1
   1375#define QLCNIC_STATS_ESWITCH		2
   1376#define QLCNIC_QUERY_RX_COUNTER		0
   1377#define QLCNIC_QUERY_TX_COUNTER		1
   1378#define QLCNIC_STATS_NOT_AVAIL	0xffffffffffffffffULL
   1379#define QLCNIC_FILL_STATS(VAL1) \
   1380	(((VAL1) == QLCNIC_STATS_NOT_AVAIL) ? 0 : VAL1)
   1381#define QLCNIC_MAC_STATS 1
   1382#define QLCNIC_ESW_STATS 2
   1383
   1384#define QLCNIC_ADD_ESW_STATS(VAL1, VAL2)\
   1385do {	\
   1386	if (((VAL1) == QLCNIC_STATS_NOT_AVAIL) && \
   1387	    ((VAL2) != QLCNIC_STATS_NOT_AVAIL)) \
   1388		(VAL1) = (VAL2); \
   1389	else if (((VAL1) != QLCNIC_STATS_NOT_AVAIL) && \
   1390		 ((VAL2) != QLCNIC_STATS_NOT_AVAIL)) \
   1391			(VAL1) += (VAL2); \
   1392} while (0)
   1393
   1394struct qlcnic_mac_statistics_le {
   1395	__le64	mac_tx_frames;
   1396	__le64	mac_tx_bytes;
   1397	__le64	mac_tx_mcast_pkts;
   1398	__le64	mac_tx_bcast_pkts;
   1399	__le64	mac_tx_pause_cnt;
   1400	__le64	mac_tx_ctrl_pkt;
   1401	__le64	mac_tx_lt_64b_pkts;
   1402	__le64	mac_tx_lt_127b_pkts;
   1403	__le64	mac_tx_lt_255b_pkts;
   1404	__le64	mac_tx_lt_511b_pkts;
   1405	__le64	mac_tx_lt_1023b_pkts;
   1406	__le64	mac_tx_lt_1518b_pkts;
   1407	__le64	mac_tx_gt_1518b_pkts;
   1408	__le64	rsvd1[3];
   1409
   1410	__le64	mac_rx_frames;
   1411	__le64	mac_rx_bytes;
   1412	__le64	mac_rx_mcast_pkts;
   1413	__le64	mac_rx_bcast_pkts;
   1414	__le64	mac_rx_pause_cnt;
   1415	__le64	mac_rx_ctrl_pkt;
   1416	__le64	mac_rx_lt_64b_pkts;
   1417	__le64	mac_rx_lt_127b_pkts;
   1418	__le64	mac_rx_lt_255b_pkts;
   1419	__le64	mac_rx_lt_511b_pkts;
   1420	__le64	mac_rx_lt_1023b_pkts;
   1421	__le64	mac_rx_lt_1518b_pkts;
   1422	__le64	mac_rx_gt_1518b_pkts;
   1423	__le64	rsvd2[3];
   1424
   1425	__le64	mac_rx_length_error;
   1426	__le64	mac_rx_length_small;
   1427	__le64	mac_rx_length_large;
   1428	__le64	mac_rx_jabber;
   1429	__le64	mac_rx_dropped;
   1430	__le64	mac_rx_crc_error;
   1431	__le64	mac_align_error;
   1432} __packed;
   1433
   1434struct qlcnic_mac_statistics {
   1435	u64	mac_tx_frames;
   1436	u64	mac_tx_bytes;
   1437	u64	mac_tx_mcast_pkts;
   1438	u64	mac_tx_bcast_pkts;
   1439	u64	mac_tx_pause_cnt;
   1440	u64	mac_tx_ctrl_pkt;
   1441	u64	mac_tx_lt_64b_pkts;
   1442	u64	mac_tx_lt_127b_pkts;
   1443	u64	mac_tx_lt_255b_pkts;
   1444	u64	mac_tx_lt_511b_pkts;
   1445	u64	mac_tx_lt_1023b_pkts;
   1446	u64	mac_tx_lt_1518b_pkts;
   1447	u64	mac_tx_gt_1518b_pkts;
   1448	u64	rsvd1[3];
   1449	u64	mac_rx_frames;
   1450	u64	mac_rx_bytes;
   1451	u64	mac_rx_mcast_pkts;
   1452	u64	mac_rx_bcast_pkts;
   1453	u64	mac_rx_pause_cnt;
   1454	u64	mac_rx_ctrl_pkt;
   1455	u64	mac_rx_lt_64b_pkts;
   1456	u64	mac_rx_lt_127b_pkts;
   1457	u64	mac_rx_lt_255b_pkts;
   1458	u64	mac_rx_lt_511b_pkts;
   1459	u64	mac_rx_lt_1023b_pkts;
   1460	u64	mac_rx_lt_1518b_pkts;
   1461	u64	mac_rx_gt_1518b_pkts;
   1462	u64	rsvd2[3];
   1463	u64	mac_rx_length_error;
   1464	u64	mac_rx_length_small;
   1465	u64	mac_rx_length_large;
   1466	u64	mac_rx_jabber;
   1467	u64	mac_rx_dropped;
   1468	u64	mac_rx_crc_error;
   1469	u64	mac_align_error;
   1470};
   1471
   1472struct qlcnic_esw_stats_le {
   1473	__le16 context_id;
   1474	__le16 version;
   1475	__le16 size;
   1476	__le16 unused;
   1477	__le64 unicast_frames;
   1478	__le64 multicast_frames;
   1479	__le64 broadcast_frames;
   1480	__le64 dropped_frames;
   1481	__le64 errors;
   1482	__le64 local_frames;
   1483	__le64 numbytes;
   1484	__le64 rsvd[3];
   1485} __packed;
   1486
   1487struct __qlcnic_esw_statistics {
   1488	u16	context_id;
   1489	u16	version;
   1490	u16	size;
   1491	u16	unused;
   1492	u64	unicast_frames;
   1493	u64	multicast_frames;
   1494	u64	broadcast_frames;
   1495	u64	dropped_frames;
   1496	u64	errors;
   1497	u64	local_frames;
   1498	u64	numbytes;
   1499	u64	rsvd[3];
   1500};
   1501
   1502struct qlcnic_esw_statistics {
   1503	struct __qlcnic_esw_statistics rx;
   1504	struct __qlcnic_esw_statistics tx;
   1505};
   1506
   1507#define QLCNIC_FORCE_FW_DUMP_KEY	0xdeadfeed
   1508#define QLCNIC_ENABLE_FW_DUMP		0xaddfeed
   1509#define QLCNIC_DISABLE_FW_DUMP		0xbadfeed
   1510#define QLCNIC_FORCE_FW_RESET		0xdeaddead
   1511#define QLCNIC_SET_QUIESCENT		0xadd00010
   1512#define QLCNIC_RESET_QUIESCENT		0xadd00020
   1513
   1514struct _cdrp_cmd {
   1515	u32 num;
   1516	u32 *arg;
   1517};
   1518
   1519struct qlcnic_cmd_args {
   1520	struct completion	completion;
   1521	struct list_head	list;
   1522	struct _cdrp_cmd	req;
   1523	struct _cdrp_cmd	rsp;
   1524	atomic_t		rsp_status;
   1525	int			pay_size;
   1526	u32			rsp_opcode;
   1527	u32			total_cmds;
   1528	u32			op_type;
   1529	u32			type;
   1530	u32			cmd_op;
   1531	u32			*hdr;	/* Back channel message header */
   1532	u32			*pay;	/* Back channel message payload */
   1533	u8			func_num;
   1534};
   1535
   1536int qlcnic_fw_cmd_get_minidump_temp(struct qlcnic_adapter *adapter);
   1537int qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config);
   1538int qlcnic_pci_mem_write_2M(struct qlcnic_adapter *, u64 off, u64 data);
   1539int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *, u64 off, u64 *data);
   1540
   1541#define ADDR_IN_RANGE(addr, low, high)	\
   1542	(((addr) < (high)) && ((addr) >= (low)))
   1543
   1544#define QLCRD32(adapter, off, err) \
   1545	(adapter->ahw->hw_ops->read_reg)(adapter, off, err)
   1546
   1547#define QLCWR32(adapter, off, val) \
   1548	adapter->ahw->hw_ops->write_reg(adapter, off, val)
   1549
   1550int qlcnic_pcie_sem_lock(struct qlcnic_adapter *, int, u32);
   1551void qlcnic_pcie_sem_unlock(struct qlcnic_adapter *, int);
   1552
   1553#define qlcnic_rom_lock(a)	\
   1554	qlcnic_pcie_sem_lock((a), 2, QLCNIC_ROM_LOCK_ID)
   1555#define qlcnic_rom_unlock(a)	\
   1556	qlcnic_pcie_sem_unlock((a), 2)
   1557#define qlcnic_phy_lock(a)	\
   1558	qlcnic_pcie_sem_lock((a), 3, QLCNIC_PHY_LOCK_ID)
   1559#define qlcnic_phy_unlock(a)	\
   1560	qlcnic_pcie_sem_unlock((a), 3)
   1561#define qlcnic_sw_lock(a)	\
   1562	qlcnic_pcie_sem_lock((a), 6, 0)
   1563#define qlcnic_sw_unlock(a)	\
   1564	qlcnic_pcie_sem_unlock((a), 6)
   1565#define crb_win_lock(a)	\
   1566	qlcnic_pcie_sem_lock((a), 7, QLCNIC_CRB_WIN_LOCK_ID)
   1567#define crb_win_unlock(a)	\
   1568	qlcnic_pcie_sem_unlock((a), 7)
   1569
   1570#define __QLCNIC_MAX_LED_RATE	0xf
   1571#define __QLCNIC_MAX_LED_STATE	0x2
   1572
   1573#define MAX_CTL_CHECK 1000
   1574
   1575void qlcnic_prune_lb_filters(struct qlcnic_adapter *adapter);
   1576void qlcnic_delete_lb_filters(struct qlcnic_adapter *adapter);
   1577int qlcnic_dump_fw(struct qlcnic_adapter *);
   1578int qlcnic_enable_fw_dump_state(struct qlcnic_adapter *);
   1579bool qlcnic_check_fw_dump_state(struct qlcnic_adapter *);
   1580
   1581/* Functions from qlcnic_init.c */
   1582void qlcnic_schedule_work(struct qlcnic_adapter *, work_func_t, int);
   1583int qlcnic_load_firmware(struct qlcnic_adapter *adapter);
   1584int qlcnic_need_fw_reset(struct qlcnic_adapter *adapter);
   1585void qlcnic_request_firmware(struct qlcnic_adapter *adapter);
   1586void qlcnic_release_firmware(struct qlcnic_adapter *adapter);
   1587int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter);
   1588int qlcnic_setup_idc_param(struct qlcnic_adapter *adapter);
   1589int qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter);
   1590
   1591int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp);
   1592int qlcnic_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr,
   1593				u8 *bytes, size_t size);
   1594int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter);
   1595void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter);
   1596
   1597void __iomem *qlcnic_get_ioaddr(struct qlcnic_hardware_context *, u32);
   1598
   1599int qlcnic_alloc_hw_resources(struct qlcnic_adapter *adapter);
   1600void qlcnic_free_hw_resources(struct qlcnic_adapter *adapter);
   1601
   1602int qlcnic_fw_create_ctx(struct qlcnic_adapter *adapter);
   1603void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter);
   1604
   1605void qlcnic_reset_rx_buffers_list(struct qlcnic_adapter *adapter);
   1606void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter);
   1607void qlcnic_release_tx_buffers(struct qlcnic_adapter *,
   1608			       struct qlcnic_host_tx_ring *);
   1609
   1610int qlcnic_check_fw_status(struct qlcnic_adapter *adapter);
   1611void qlcnic_watchdog_task(struct work_struct *work);
   1612void qlcnic_post_rx_buffers(struct qlcnic_adapter *adapter,
   1613		struct qlcnic_host_rds_ring *rds_ring, u8 ring_id);
   1614void qlcnic_set_multi(struct net_device *netdev);
   1615void qlcnic_flush_mcast_mac(struct qlcnic_adapter *);
   1616int qlcnic_nic_add_mac(struct qlcnic_adapter *, const u8 *, u16,
   1617		       enum qlcnic_mac_type);
   1618int qlcnic_nic_del_mac(struct qlcnic_adapter *, const u8 *);
   1619void qlcnic_82xx_free_mac_list(struct qlcnic_adapter *adapter);
   1620int qlcnic_82xx_read_phys_port_id(struct qlcnic_adapter *);
   1621
   1622int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
   1623int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *, u32);
   1624int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
   1625netdev_features_t qlcnic_fix_features(struct net_device *netdev,
   1626	netdev_features_t features);
   1627int qlcnic_set_features(struct net_device *netdev, netdev_features_t features);
   1628int qlcnic_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable);
   1629void qlcnic_update_cmd_producer(struct qlcnic_host_tx_ring *);
   1630
   1631/* Functions from qlcnic_ethtool.c */
   1632int qlcnic_check_loopback_buff(unsigned char *, u8 []);
   1633int qlcnic_do_lb_test(struct qlcnic_adapter *, u8);
   1634
   1635/* Functions from qlcnic_main.c */
   1636int qlcnic_reset_context(struct qlcnic_adapter *);
   1637void qlcnic_diag_free_res(struct net_device *netdev, int);
   1638int qlcnic_diag_alloc_res(struct net_device *netdev, int);
   1639netdev_tx_t qlcnic_xmit_frame(struct sk_buff *, struct net_device *);
   1640void qlcnic_set_tx_ring_count(struct qlcnic_adapter *, u8);
   1641void qlcnic_set_sds_ring_count(struct qlcnic_adapter *, u8);
   1642int qlcnic_setup_rings(struct qlcnic_adapter *);
   1643int qlcnic_validate_rings(struct qlcnic_adapter *, __u32, int);
   1644void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);
   1645int qlcnic_enable_msix(struct qlcnic_adapter *, u32);
   1646void qlcnic_set_drv_version(struct qlcnic_adapter *);
   1647
   1648/*  eSwitch management functions */
   1649int qlcnic_config_switch_port(struct qlcnic_adapter *,
   1650				struct qlcnic_esw_func_cfg *);
   1651
   1652int qlcnic_get_eswitch_port_config(struct qlcnic_adapter *,
   1653				struct qlcnic_esw_func_cfg *);
   1654int qlcnic_config_port_mirroring(struct qlcnic_adapter *, u8, u8, u8);
   1655int qlcnic_get_port_stats(struct qlcnic_adapter *, const u8, const u8,
   1656					struct __qlcnic_esw_statistics *);
   1657int qlcnic_get_eswitch_stats(struct qlcnic_adapter *, const u8, u8,
   1658					struct __qlcnic_esw_statistics *);
   1659int qlcnic_clear_esw_stats(struct qlcnic_adapter *adapter, u8, u8, u8);
   1660int qlcnic_get_mac_stats(struct qlcnic_adapter *, struct qlcnic_mac_statistics *);
   1661
   1662void qlcnic_free_mbx_args(struct qlcnic_cmd_args *cmd);
   1663
   1664int qlcnic_alloc_sds_rings(struct qlcnic_recv_context *, int);
   1665void qlcnic_free_sds_rings(struct qlcnic_recv_context *);
   1666void qlcnic_advert_link_change(struct qlcnic_adapter *, int);
   1667void qlcnic_free_tx_rings(struct qlcnic_adapter *);
   1668int qlcnic_alloc_tx_rings(struct qlcnic_adapter *, struct net_device *);
   1669void qlcnic_dump_mbx(struct qlcnic_adapter *, struct qlcnic_cmd_args *);
   1670
   1671void qlcnic_create_sysfs_entries(struct qlcnic_adapter *adapter);
   1672void qlcnic_remove_sysfs_entries(struct qlcnic_adapter *adapter);
   1673void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter);
   1674void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter);
   1675
   1676int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32);
   1677int qlcnicvf_config_led(struct qlcnic_adapter *, u32, u32);
   1678void qlcnic_set_vlan_config(struct qlcnic_adapter *,
   1679			    struct qlcnic_esw_func_cfg *);
   1680void qlcnic_set_eswitch_port_features(struct qlcnic_adapter *,
   1681				      struct qlcnic_esw_func_cfg *);
   1682int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter  *);
   1683void qlcnic_down(struct qlcnic_adapter *, struct net_device *);
   1684int qlcnic_up(struct qlcnic_adapter *, struct net_device *);
   1685void __qlcnic_down(struct qlcnic_adapter *, struct net_device *);
   1686void qlcnic_detach(struct qlcnic_adapter *);
   1687void qlcnic_teardown_intr(struct qlcnic_adapter *);
   1688int qlcnic_attach(struct qlcnic_adapter *);
   1689int __qlcnic_up(struct qlcnic_adapter *, struct net_device *);
   1690void qlcnic_restore_indev_addr(struct net_device *, unsigned long);
   1691
   1692int qlcnic_check_temp(struct qlcnic_adapter *);
   1693int qlcnic_init_pci_info(struct qlcnic_adapter *);
   1694int qlcnic_set_default_offload_settings(struct qlcnic_adapter *);
   1695int qlcnic_reset_npar_config(struct qlcnic_adapter *);
   1696int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *);
   1697int qlcnic_set_vxlan_port(struct qlcnic_adapter *adapter, u16 port);
   1698int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter, u16 port);
   1699int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter);
   1700int qlcnic_read_mac_addr(struct qlcnic_adapter *);
   1701int qlcnic_setup_netdev(struct qlcnic_adapter *, struct net_device *);
   1702void qlcnic_set_netdev_features(struct qlcnic_adapter *,
   1703				struct qlcnic_esw_func_cfg *);
   1704void qlcnic_sriov_vf_set_multi(struct net_device *);
   1705int qlcnic_is_valid_nic_func(struct qlcnic_adapter *, u8);
   1706int qlcnic_get_pci_func_type(struct qlcnic_adapter *, u16, u16 *, u16 *,
   1707			     u16 *);
   1708
   1709/*
   1710 * QLOGIC Board information
   1711 */
   1712
   1713#define QLCNIC_MAX_BOARD_NAME_LEN 100
   1714struct qlcnic_board_info {
   1715	unsigned short  vendor;
   1716	unsigned short  device;
   1717	unsigned short  sub_vendor;
   1718	unsigned short  sub_device;
   1719	char short_name[QLCNIC_MAX_BOARD_NAME_LEN];
   1720};
   1721
   1722static inline u32 qlcnic_tx_avail(struct qlcnic_host_tx_ring *tx_ring)
   1723{
   1724	if (likely(tx_ring->producer < tx_ring->sw_consumer))
   1725		return tx_ring->sw_consumer - tx_ring->producer;
   1726	else
   1727		return tx_ring->sw_consumer + tx_ring->num_desc -
   1728				tx_ring->producer;
   1729}
   1730
   1731struct qlcnic_nic_template {
   1732	int (*config_bridged_mode) (struct qlcnic_adapter *, u32);
   1733	int (*config_led) (struct qlcnic_adapter *, u32, u32);
   1734	int (*start_firmware) (struct qlcnic_adapter *);
   1735	int (*init_driver) (struct qlcnic_adapter *);
   1736	void (*request_reset) (struct qlcnic_adapter *, u32);
   1737	void (*cancel_idc_work) (struct qlcnic_adapter *);
   1738	int (*napi_add)(struct qlcnic_adapter *, struct net_device *);
   1739	void (*napi_del)(struct qlcnic_adapter *);
   1740	void (*config_ipaddr)(struct qlcnic_adapter *, __be32, int);
   1741	irqreturn_t (*clear_legacy_intr)(struct qlcnic_adapter *);
   1742	int (*shutdown)(struct pci_dev *);
   1743	int (*resume)(struct qlcnic_adapter *);
   1744};
   1745
   1746struct qlcnic_mbx_ops {
   1747	int (*enqueue_cmd) (struct qlcnic_adapter *,
   1748			    struct qlcnic_cmd_args *, unsigned long *);
   1749	void (*dequeue_cmd) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
   1750	void (*decode_resp) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
   1751	void (*encode_cmd) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
   1752	void (*nofity_fw) (struct qlcnic_adapter *, u8);
   1753};
   1754
   1755int qlcnic_83xx_init_mailbox_work(struct qlcnic_adapter *);
   1756void qlcnic_83xx_detach_mailbox_work(struct qlcnic_adapter *);
   1757void qlcnic_83xx_reinit_mbx_work(struct qlcnic_mailbox *mbx);
   1758void qlcnic_83xx_free_mailbox(struct qlcnic_mailbox *mbx);
   1759void qlcnic_update_stats(struct qlcnic_adapter *);
   1760
   1761/* Adapter hardware abstraction */
   1762struct qlcnic_hardware_ops {
   1763	void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
   1764	void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
   1765	int (*read_reg) (struct qlcnic_adapter *, ulong, int *);
   1766	int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
   1767	void (*get_ocm_win) (struct qlcnic_hardware_context *);
   1768	int (*get_mac_address) (struct qlcnic_adapter *, u8 *, u8);
   1769	int (*setup_intr) (struct qlcnic_adapter *);
   1770	int (*alloc_mbx_args)(struct qlcnic_cmd_args *,
   1771			      struct qlcnic_adapter *, u32);
   1772	int (*mbx_cmd) (struct qlcnic_adapter *, struct qlcnic_cmd_args *);
   1773	void (*get_func_no) (struct qlcnic_adapter *);
   1774	int (*api_lock) (struct qlcnic_adapter *);
   1775	void (*api_unlock) (struct qlcnic_adapter *);
   1776	void (*add_sysfs) (struct qlcnic_adapter *);
   1777	void (*remove_sysfs) (struct qlcnic_adapter *);
   1778	void (*process_lb_rcv_ring_diag) (struct qlcnic_host_sds_ring *);
   1779	int (*create_rx_ctx) (struct qlcnic_adapter *);
   1780	int (*create_tx_ctx) (struct qlcnic_adapter *,
   1781	struct qlcnic_host_tx_ring *, int);
   1782	void (*del_rx_ctx) (struct qlcnic_adapter *);
   1783	void (*del_tx_ctx) (struct qlcnic_adapter *,
   1784			    struct qlcnic_host_tx_ring *);
   1785	int (*setup_link_event) (struct qlcnic_adapter *, int);
   1786	int (*get_nic_info) (struct qlcnic_adapter *, struct qlcnic_info *, u8);
   1787	int (*get_pci_info) (struct qlcnic_adapter *, struct qlcnic_pci_info *);
   1788	int (*set_nic_info) (struct qlcnic_adapter *, struct qlcnic_info *);
   1789	int (*change_macvlan) (struct qlcnic_adapter *, u8*, u16, u8);
   1790	void (*napi_enable) (struct qlcnic_adapter *);
   1791	void (*napi_disable) (struct qlcnic_adapter *);
   1792	int (*config_intr_coal) (struct qlcnic_adapter *,
   1793				 struct ethtool_coalesce *);
   1794	int (*config_rss) (struct qlcnic_adapter *, int);
   1795	int (*config_hw_lro) (struct qlcnic_adapter *, int);
   1796	int (*config_loopback) (struct qlcnic_adapter *, u8);
   1797	int (*clear_loopback) (struct qlcnic_adapter *, u8);
   1798	int (*config_promisc_mode) (struct qlcnic_adapter *, u32);
   1799	void (*change_l2_filter)(struct qlcnic_adapter *adapter, u64 *addr,
   1800				 u16 vlan, struct qlcnic_host_tx_ring *tx_ring);
   1801	int (*get_board_info) (struct qlcnic_adapter *);
   1802	void (*set_mac_filter_count) (struct qlcnic_adapter *);
   1803	void (*free_mac_list) (struct qlcnic_adapter *);
   1804	int (*read_phys_port_id) (struct qlcnic_adapter *);
   1805	pci_ers_result_t (*io_error_detected) (struct pci_dev *,
   1806					       pci_channel_state_t);
   1807	pci_ers_result_t (*io_slot_reset) (struct pci_dev *);
   1808	void (*io_resume) (struct pci_dev *);
   1809	void (*get_beacon_state)(struct qlcnic_adapter *);
   1810	void (*enable_sds_intr) (struct qlcnic_adapter *,
   1811				 struct qlcnic_host_sds_ring *);
   1812	void (*disable_sds_intr) (struct qlcnic_adapter *,
   1813				  struct qlcnic_host_sds_ring *);
   1814	void (*enable_tx_intr) (struct qlcnic_adapter *,
   1815				struct qlcnic_host_tx_ring *);
   1816	void (*disable_tx_intr) (struct qlcnic_adapter *,
   1817				 struct qlcnic_host_tx_ring *);
   1818	u32 (*get_saved_state)(void *, u32);
   1819	void (*set_saved_state)(void *, u32, u32);
   1820	void (*cache_tmpl_hdr_values)(struct qlcnic_fw_dump *);
   1821	u32 (*get_cap_size)(void *, int);
   1822	void (*set_sys_info)(void *, int, u32);
   1823	void (*store_cap_mask)(void *, u32);
   1824	bool (*encap_rx_offload) (struct qlcnic_adapter *adapter);
   1825	bool (*encap_tx_offload) (struct qlcnic_adapter *adapter);
   1826};
   1827
   1828extern struct qlcnic_nic_template qlcnic_vf_ops;
   1829
   1830static inline bool qlcnic_83xx_encap_tx_offload(struct qlcnic_adapter *adapter)
   1831{
   1832	return adapter->ahw->extra_capability[0] &
   1833	       QLCNIC_83XX_FW_CAPAB_ENCAP_TX_OFFLOAD;
   1834}
   1835
   1836static inline bool qlcnic_83xx_encap_rx_offload(struct qlcnic_adapter *adapter)
   1837{
   1838	return adapter->ahw->extra_capability[0] &
   1839	       QLCNIC_83XX_FW_CAPAB_ENCAP_RX_OFFLOAD;
   1840}
   1841
   1842static inline bool qlcnic_82xx_encap_tx_offload(struct qlcnic_adapter *adapter)
   1843{
   1844	return false;
   1845}
   1846
   1847static inline bool qlcnic_82xx_encap_rx_offload(struct qlcnic_adapter *adapter)
   1848{
   1849        return false;
   1850}
   1851
   1852static inline bool qlcnic_encap_rx_offload(struct qlcnic_adapter *adapter)
   1853{
   1854        return adapter->ahw->hw_ops->encap_rx_offload(adapter);
   1855}
   1856
   1857static inline bool qlcnic_encap_tx_offload(struct qlcnic_adapter *adapter)
   1858{
   1859        return adapter->ahw->hw_ops->encap_tx_offload(adapter);
   1860}
   1861
   1862static inline int qlcnic_start_firmware(struct qlcnic_adapter *adapter)
   1863{
   1864	return adapter->nic_ops->start_firmware(adapter);
   1865}
   1866
   1867static inline void qlcnic_read_crb(struct qlcnic_adapter *adapter, char *buf,
   1868				   loff_t offset, size_t size)
   1869{
   1870	adapter->ahw->hw_ops->read_crb(adapter, buf, offset, size);
   1871}
   1872
   1873static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf,
   1874				    loff_t offset, size_t size)
   1875{
   1876	adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
   1877}
   1878
   1879static inline int qlcnic_get_mac_address(struct qlcnic_adapter *adapter,
   1880					 u8 *mac, u8 function)
   1881{
   1882	return adapter->ahw->hw_ops->get_mac_address(adapter, mac, function);
   1883}
   1884
   1885static inline int qlcnic_setup_intr(struct qlcnic_adapter *adapter)
   1886{
   1887	return adapter->ahw->hw_ops->setup_intr(adapter);
   1888}
   1889
   1890static inline int qlcnic_alloc_mbx_args(struct qlcnic_cmd_args *mbx,
   1891					struct qlcnic_adapter *adapter, u32 arg)
   1892{
   1893	return adapter->ahw->hw_ops->alloc_mbx_args(mbx, adapter, arg);
   1894}
   1895
   1896static inline int qlcnic_issue_cmd(struct qlcnic_adapter *adapter,
   1897				   struct qlcnic_cmd_args *cmd)
   1898{
   1899	if (adapter->ahw->hw_ops->mbx_cmd)
   1900		return adapter->ahw->hw_ops->mbx_cmd(adapter, cmd);
   1901
   1902	return -EIO;
   1903}
   1904
   1905static inline void qlcnic_get_func_no(struct qlcnic_adapter *adapter)
   1906{
   1907	adapter->ahw->hw_ops->get_func_no(adapter);
   1908}
   1909
   1910static inline int qlcnic_api_lock(struct qlcnic_adapter *adapter)
   1911{
   1912	return adapter->ahw->hw_ops->api_lock(adapter);
   1913}
   1914
   1915static inline void qlcnic_api_unlock(struct qlcnic_adapter *adapter)
   1916{
   1917	adapter->ahw->hw_ops->api_unlock(adapter);
   1918}
   1919
   1920static inline void qlcnic_add_sysfs(struct qlcnic_adapter *adapter)
   1921{
   1922	if (adapter->ahw->hw_ops->add_sysfs)
   1923		adapter->ahw->hw_ops->add_sysfs(adapter);
   1924}
   1925
   1926static inline void qlcnic_remove_sysfs(struct qlcnic_adapter *adapter)
   1927{
   1928	if (adapter->ahw->hw_ops->remove_sysfs)
   1929		adapter->ahw->hw_ops->remove_sysfs(adapter);
   1930}
   1931
   1932static inline void
   1933qlcnic_process_rcv_ring_diag(struct qlcnic_host_sds_ring *sds_ring)
   1934{
   1935	sds_ring->adapter->ahw->hw_ops->process_lb_rcv_ring_diag(sds_ring);
   1936}
   1937
   1938static inline int qlcnic_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
   1939{
   1940	return adapter->ahw->hw_ops->create_rx_ctx(adapter);
   1941}
   1942
   1943static inline int qlcnic_fw_cmd_create_tx_ctx(struct qlcnic_adapter *adapter,
   1944					      struct qlcnic_host_tx_ring *ptr,
   1945					      int ring)
   1946{
   1947	return adapter->ahw->hw_ops->create_tx_ctx(adapter, ptr, ring);
   1948}
   1949
   1950static inline void qlcnic_fw_cmd_del_rx_ctx(struct qlcnic_adapter *adapter)
   1951{
   1952	return adapter->ahw->hw_ops->del_rx_ctx(adapter);
   1953}
   1954
   1955static inline void qlcnic_fw_cmd_del_tx_ctx(struct qlcnic_adapter *adapter,
   1956					    struct qlcnic_host_tx_ring *ptr)
   1957{
   1958	return adapter->ahw->hw_ops->del_tx_ctx(adapter, ptr);
   1959}
   1960
   1961static inline int qlcnic_linkevent_request(struct qlcnic_adapter *adapter,
   1962					   int enable)
   1963{
   1964	return adapter->ahw->hw_ops->setup_link_event(adapter, enable);
   1965}
   1966
   1967static inline int qlcnic_get_nic_info(struct qlcnic_adapter *adapter,
   1968				      struct qlcnic_info *info, u8 id)
   1969{
   1970	return adapter->ahw->hw_ops->get_nic_info(adapter, info, id);
   1971}
   1972
   1973static inline int qlcnic_get_pci_info(struct qlcnic_adapter *adapter,
   1974				      struct qlcnic_pci_info *info)
   1975{
   1976	return adapter->ahw->hw_ops->get_pci_info(adapter, info);
   1977}
   1978
   1979static inline int qlcnic_set_nic_info(struct qlcnic_adapter *adapter,
   1980				      struct qlcnic_info *info)
   1981{
   1982	return adapter->ahw->hw_ops->set_nic_info(adapter, info);
   1983}
   1984
   1985static inline int qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter,
   1986					    u8 *addr, u16 id, u8 cmd)
   1987{
   1988	return adapter->ahw->hw_ops->change_macvlan(adapter, addr, id, cmd);
   1989}
   1990
   1991static inline int qlcnic_napi_add(struct qlcnic_adapter *adapter,
   1992				  struct net_device *netdev)
   1993{
   1994	return adapter->nic_ops->napi_add(adapter, netdev);
   1995}
   1996
   1997static inline void qlcnic_napi_del(struct qlcnic_adapter *adapter)
   1998{
   1999	adapter->nic_ops->napi_del(adapter);
   2000}
   2001
   2002static inline void qlcnic_napi_enable(struct qlcnic_adapter *adapter)
   2003{
   2004	adapter->ahw->hw_ops->napi_enable(adapter);
   2005}
   2006
   2007static inline int __qlcnic_shutdown(struct pci_dev *pdev)
   2008{
   2009	struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
   2010
   2011	return adapter->nic_ops->shutdown(pdev);
   2012}
   2013
   2014static inline int __qlcnic_resume(struct qlcnic_adapter *adapter)
   2015{
   2016	return adapter->nic_ops->resume(adapter);
   2017}
   2018
   2019static inline void qlcnic_napi_disable(struct qlcnic_adapter *adapter)
   2020{
   2021	adapter->ahw->hw_ops->napi_disable(adapter);
   2022}
   2023
   2024static inline int qlcnic_config_intr_coalesce(struct qlcnic_adapter *adapter,
   2025					      struct ethtool_coalesce *ethcoal)
   2026{
   2027	return adapter->ahw->hw_ops->config_intr_coal(adapter, ethcoal);
   2028}
   2029
   2030static inline int qlcnic_config_rss(struct qlcnic_adapter *adapter, int enable)
   2031{
   2032	return adapter->ahw->hw_ops->config_rss(adapter, enable);
   2033}
   2034
   2035static inline int qlcnic_config_hw_lro(struct qlcnic_adapter *adapter,
   2036				       int enable)
   2037{
   2038	return adapter->ahw->hw_ops->config_hw_lro(adapter, enable);
   2039}
   2040
   2041static inline int qlcnic_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
   2042{
   2043	return adapter->ahw->hw_ops->config_loopback(adapter, mode);
   2044}
   2045
   2046static inline int qlcnic_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
   2047{
   2048	return adapter->ahw->hw_ops->clear_loopback(adapter, mode);
   2049}
   2050
   2051static inline int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter,
   2052					 u32 mode)
   2053{
   2054	return adapter->ahw->hw_ops->config_promisc_mode(adapter, mode);
   2055}
   2056
   2057static inline void qlcnic_change_filter(struct qlcnic_adapter *adapter,
   2058					u64 *addr, u16 vlan,
   2059					struct qlcnic_host_tx_ring *tx_ring)
   2060{
   2061	adapter->ahw->hw_ops->change_l2_filter(adapter, addr, vlan, tx_ring);
   2062}
   2063
   2064static inline int qlcnic_get_board_info(struct qlcnic_adapter *adapter)
   2065{
   2066	return adapter->ahw->hw_ops->get_board_info(adapter);
   2067}
   2068
   2069static inline void qlcnic_free_mac_list(struct qlcnic_adapter *adapter)
   2070{
   2071	return adapter->ahw->hw_ops->free_mac_list(adapter);
   2072}
   2073
   2074static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter)
   2075{
   2076	if (adapter->ahw->hw_ops->set_mac_filter_count)
   2077		adapter->ahw->hw_ops->set_mac_filter_count(adapter);
   2078}
   2079
   2080static inline void qlcnic_get_beacon_state(struct qlcnic_adapter *adapter)
   2081{
   2082	adapter->ahw->hw_ops->get_beacon_state(adapter);
   2083}
   2084
   2085static inline void qlcnic_read_phys_port_id(struct qlcnic_adapter *adapter)
   2086{
   2087	if (adapter->ahw->hw_ops->read_phys_port_id)
   2088		adapter->ahw->hw_ops->read_phys_port_id(adapter);
   2089}
   2090
   2091static inline u32 qlcnic_get_saved_state(struct qlcnic_adapter *adapter,
   2092					 void *t_hdr, u32 index)
   2093{
   2094	return adapter->ahw->hw_ops->get_saved_state(t_hdr, index);
   2095}
   2096
   2097static inline void qlcnic_set_saved_state(struct qlcnic_adapter *adapter,
   2098					  void *t_hdr, u32 index, u32 value)
   2099{
   2100	adapter->ahw->hw_ops->set_saved_state(t_hdr, index, value);
   2101}
   2102
   2103static inline void qlcnic_cache_tmpl_hdr_values(struct qlcnic_adapter *adapter,
   2104						struct qlcnic_fw_dump *fw_dump)
   2105{
   2106	adapter->ahw->hw_ops->cache_tmpl_hdr_values(fw_dump);
   2107}
   2108
   2109static inline u32 qlcnic_get_cap_size(struct qlcnic_adapter *adapter,
   2110				      void *tmpl_hdr, int index)
   2111{
   2112	return adapter->ahw->hw_ops->get_cap_size(tmpl_hdr, index);
   2113}
   2114
   2115static inline void qlcnic_set_sys_info(struct qlcnic_adapter *adapter,
   2116				       void *tmpl_hdr, int idx, u32 value)
   2117{
   2118	adapter->ahw->hw_ops->set_sys_info(tmpl_hdr, idx, value);
   2119}
   2120
   2121static inline void qlcnic_store_cap_mask(struct qlcnic_adapter *adapter,
   2122					 void *tmpl_hdr, u32 mask)
   2123{
   2124	adapter->ahw->hw_ops->store_cap_mask(tmpl_hdr, mask);
   2125}
   2126
   2127static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter,
   2128					    u32 key)
   2129{
   2130	if (adapter->nic_ops->request_reset)
   2131		adapter->nic_ops->request_reset(adapter, key);
   2132}
   2133
   2134static inline void qlcnic_cancel_idc_work(struct qlcnic_adapter *adapter)
   2135{
   2136	if (adapter->nic_ops->cancel_idc_work)
   2137		adapter->nic_ops->cancel_idc_work(adapter);
   2138}
   2139
   2140static inline irqreturn_t
   2141qlcnic_clear_legacy_intr(struct qlcnic_adapter *adapter)
   2142{
   2143	return adapter->nic_ops->clear_legacy_intr(adapter);
   2144}
   2145
   2146static inline int qlcnic_config_led(struct qlcnic_adapter *adapter, u32 state,
   2147				    u32 rate)
   2148{
   2149	return adapter->nic_ops->config_led(adapter, state, rate);
   2150}
   2151
   2152static inline void qlcnic_config_ipaddr(struct qlcnic_adapter *adapter,
   2153					__be32 ip, int cmd)
   2154{
   2155	adapter->nic_ops->config_ipaddr(adapter, ip, cmd);
   2156}
   2157
   2158static inline bool qlcnic_check_multi_tx(struct qlcnic_adapter *adapter)
   2159{
   2160	return test_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state);
   2161}
   2162
   2163static inline void
   2164qlcnic_82xx_enable_tx_intr(struct qlcnic_adapter *adapter,
   2165			   struct qlcnic_host_tx_ring *tx_ring)
   2166{
   2167	if (qlcnic_check_multi_tx(adapter) &&
   2168	    !adapter->ahw->diag_test)
   2169		writel(0x0, tx_ring->crb_intr_mask);
   2170}
   2171
   2172static inline void
   2173qlcnic_82xx_disable_tx_intr(struct qlcnic_adapter *adapter,
   2174			    struct qlcnic_host_tx_ring *tx_ring)
   2175{
   2176	if (qlcnic_check_multi_tx(adapter) &&
   2177	    !adapter->ahw->diag_test)
   2178		writel(1, tx_ring->crb_intr_mask);
   2179}
   2180
   2181static inline void
   2182qlcnic_83xx_enable_tx_intr(struct qlcnic_adapter *adapter,
   2183			   struct qlcnic_host_tx_ring *tx_ring)
   2184{
   2185	writel(0, tx_ring->crb_intr_mask);
   2186}
   2187
   2188static inline void
   2189qlcnic_83xx_disable_tx_intr(struct qlcnic_adapter *adapter,
   2190			    struct qlcnic_host_tx_ring *tx_ring)
   2191{
   2192	writel(1, tx_ring->crb_intr_mask);
   2193}
   2194
   2195/* Enable MSI-x and INT-x interrupts */
   2196static inline void
   2197qlcnic_83xx_enable_sds_intr(struct qlcnic_adapter *adapter,
   2198			    struct qlcnic_host_sds_ring *sds_ring)
   2199{
   2200	writel(0, sds_ring->crb_intr_mask);
   2201}
   2202
   2203/* Disable MSI-x and INT-x interrupts */
   2204static inline void
   2205qlcnic_83xx_disable_sds_intr(struct qlcnic_adapter *adapter,
   2206			     struct qlcnic_host_sds_ring *sds_ring)
   2207{
   2208	writel(1, sds_ring->crb_intr_mask);
   2209}
   2210
   2211static inline void qlcnic_disable_multi_tx(struct qlcnic_adapter *adapter)
   2212{
   2213	test_and_clear_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state);
   2214	adapter->drv_tx_rings = QLCNIC_SINGLE_RING;
   2215}
   2216
   2217/* When operating in a muti tx mode, driver needs to write 0x1
   2218 * to src register, instead of 0x0 to disable receiving interrupt.
   2219 */
   2220static inline void
   2221qlcnic_82xx_disable_sds_intr(struct qlcnic_adapter *adapter,
   2222			     struct qlcnic_host_sds_ring *sds_ring)
   2223{
   2224	if (qlcnic_check_multi_tx(adapter) &&
   2225	    !adapter->ahw->diag_test &&
   2226	    (adapter->flags & QLCNIC_MSIX_ENABLED))
   2227		writel(0x1, sds_ring->crb_intr_mask);
   2228	else
   2229		writel(0, sds_ring->crb_intr_mask);
   2230}
   2231
   2232static inline void qlcnic_enable_sds_intr(struct qlcnic_adapter *adapter,
   2233					  struct qlcnic_host_sds_ring *sds_ring)
   2234{
   2235	if (adapter->ahw->hw_ops->enable_sds_intr)
   2236		adapter->ahw->hw_ops->enable_sds_intr(adapter, sds_ring);
   2237}
   2238
   2239static inline void
   2240qlcnic_disable_sds_intr(struct qlcnic_adapter *adapter,
   2241			struct qlcnic_host_sds_ring *sds_ring)
   2242{
   2243	if (adapter->ahw->hw_ops->disable_sds_intr)
   2244		adapter->ahw->hw_ops->disable_sds_intr(adapter, sds_ring);
   2245}
   2246
   2247static inline void qlcnic_enable_tx_intr(struct qlcnic_adapter *adapter,
   2248					 struct qlcnic_host_tx_ring *tx_ring)
   2249{
   2250	if (adapter->ahw->hw_ops->enable_tx_intr)
   2251		adapter->ahw->hw_ops->enable_tx_intr(adapter, tx_ring);
   2252}
   2253
   2254static inline void qlcnic_disable_tx_intr(struct qlcnic_adapter *adapter,
   2255					  struct qlcnic_host_tx_ring *tx_ring)
   2256{
   2257	if (adapter->ahw->hw_ops->disable_tx_intr)
   2258		adapter->ahw->hw_ops->disable_tx_intr(adapter, tx_ring);
   2259}
   2260
   2261/* When operating in a muti tx mode, driver needs to write 0x0
   2262 * to src register, instead of 0x1 to enable receiving interrupts.
   2263 */
   2264static inline void
   2265qlcnic_82xx_enable_sds_intr(struct qlcnic_adapter *adapter,
   2266			    struct qlcnic_host_sds_ring *sds_ring)
   2267{
   2268	if (qlcnic_check_multi_tx(adapter) &&
   2269	    !adapter->ahw->diag_test &&
   2270	    (adapter->flags & QLCNIC_MSIX_ENABLED))
   2271		writel(0, sds_ring->crb_intr_mask);
   2272	else
   2273		writel(0x1, sds_ring->crb_intr_mask);
   2274
   2275	if (!QLCNIC_IS_MSI_FAMILY(adapter))
   2276		writel(0xfbff, adapter->tgt_mask_reg);
   2277}
   2278
   2279static inline int qlcnic_get_diag_lock(struct qlcnic_adapter *adapter)
   2280{
   2281	return test_and_set_bit(__QLCNIC_DIAG_MODE, &adapter->state);
   2282}
   2283
   2284static inline void qlcnic_release_diag_lock(struct qlcnic_adapter *adapter)
   2285{
   2286	clear_bit(__QLCNIC_DIAG_MODE, &adapter->state);
   2287}
   2288
   2289static inline int qlcnic_check_diag_status(struct qlcnic_adapter *adapter)
   2290{
   2291	return test_bit(__QLCNIC_DIAG_MODE, &adapter->state);
   2292}
   2293
   2294extern const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops;
   2295extern const struct ethtool_ops qlcnic_ethtool_ops;
   2296extern const struct ethtool_ops qlcnic_ethtool_failed_ops;
   2297
   2298#define QLCDB(adapter, lvl, _fmt, _args...) do {	\
   2299	if (NETIF_MSG_##lvl & adapter->ahw->msg_enable)	\
   2300		printk(KERN_INFO "%s: %s: " _fmt,	\
   2301			 dev_name(&adapter->pdev->dev),	\
   2302			__func__, ##_args);		\
   2303	} while (0)
   2304
   2305#define PCI_DEVICE_ID_QLOGIC_QLE824X		0x8020
   2306#define PCI_DEVICE_ID_QLOGIC_QLE834X		0x8030
   2307#define PCI_DEVICE_ID_QLOGIC_VF_QLE834X	0x8430
   2308#define PCI_DEVICE_ID_QLOGIC_QLE8830		0x8830
   2309#define PCI_DEVICE_ID_QLOGIC_VF_QLE8C30		0x8C30
   2310#define PCI_DEVICE_ID_QLOGIC_QLE844X		0x8040
   2311#define PCI_DEVICE_ID_QLOGIC_VF_QLE844X	0x8440
   2312
   2313static inline bool qlcnic_82xx_check(struct qlcnic_adapter *adapter)
   2314{
   2315	unsigned short device = adapter->pdev->device;
   2316	return (device == PCI_DEVICE_ID_QLOGIC_QLE824X) ? true : false;
   2317}
   2318
   2319static inline bool qlcnic_84xx_check(struct qlcnic_adapter *adapter)
   2320{
   2321	unsigned short device = adapter->pdev->device;
   2322
   2323	return ((device == PCI_DEVICE_ID_QLOGIC_QLE844X) ||
   2324		(device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X)) ? true : false;
   2325}
   2326
   2327static inline bool qlcnic_83xx_check(struct qlcnic_adapter *adapter)
   2328{
   2329	unsigned short device = adapter->pdev->device;
   2330	bool status;
   2331
   2332	status = ((device == PCI_DEVICE_ID_QLOGIC_QLE834X) ||
   2333		  (device == PCI_DEVICE_ID_QLOGIC_QLE8830) ||
   2334		  (device == PCI_DEVICE_ID_QLOGIC_QLE844X) ||
   2335		  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) ||
   2336		  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
   2337		  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
   2338
   2339	return status;
   2340}
   2341
   2342static inline bool qlcnic_sriov_pf_check(struct qlcnic_adapter *adapter)
   2343{
   2344	return (adapter->ahw->op_mode == QLCNIC_SRIOV_PF_FUNC) ? true : false;
   2345}
   2346
   2347static inline bool qlcnic_sriov_vf_check(struct qlcnic_adapter *adapter)
   2348{
   2349	unsigned short device = adapter->pdev->device;
   2350	bool status;
   2351
   2352	status = ((device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
   2353		  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE844X) ||
   2354		  (device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
   2355
   2356	return status;
   2357}
   2358
   2359static inline bool qlcnic_83xx_pf_check(struct qlcnic_adapter *adapter)
   2360{
   2361	unsigned short device = adapter->pdev->device;
   2362
   2363	return (device == PCI_DEVICE_ID_QLOGIC_QLE834X) ? true : false;
   2364}
   2365
   2366static inline bool qlcnic_83xx_vf_check(struct qlcnic_adapter *adapter)
   2367{
   2368	unsigned short device = adapter->pdev->device;
   2369
   2370	return ((device == PCI_DEVICE_ID_QLOGIC_VF_QLE834X) ||
   2371		(device == PCI_DEVICE_ID_QLOGIC_VF_QLE8C30)) ? true : false;
   2372}
   2373
   2374static inline bool qlcnic_sriov_check(struct qlcnic_adapter *adapter)
   2375{
   2376	bool status;
   2377
   2378	status = (qlcnic_sriov_pf_check(adapter) ||
   2379		  qlcnic_sriov_vf_check(adapter)) ? true : false;
   2380
   2381	return status;
   2382}
   2383
   2384static inline u32 qlcnic_get_vnic_func_count(struct qlcnic_adapter *adapter)
   2385{
   2386	if (qlcnic_84xx_check(adapter))
   2387		return QLC_84XX_VNIC_COUNT;
   2388	else
   2389		return QLC_DEFAULT_VNIC_COUNT;
   2390}
   2391
   2392static inline void qlcnic_swap32_buffer(u32 *buffer, int count)
   2393{
   2394#if defined(__BIG_ENDIAN)
   2395	u32 *tmp = buffer;
   2396	int i;
   2397
   2398	for (i = 0; i < count; i++) {
   2399		*tmp = swab32(*tmp);
   2400		tmp++;
   2401	}
   2402#endif
   2403}
   2404
   2405#ifdef CONFIG_QLCNIC_HWMON
   2406void qlcnic_register_hwmon_dev(struct qlcnic_adapter *);
   2407void qlcnic_unregister_hwmon_dev(struct qlcnic_adapter *);
   2408#else
   2409static inline void qlcnic_register_hwmon_dev(struct qlcnic_adapter *adapter)
   2410{
   2411	return;
   2412}
   2413static inline void qlcnic_unregister_hwmon_dev(struct qlcnic_adapter *adapter)
   2414{
   2415	return;
   2416}
   2417#endif
   2418#endif				/* __QLCNIC_H_ */