xref: /openbmc/linux/drivers/net/ethernet/neterion/s2io.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
186387e1aSJeff Kirsher /************************************************************************
286387e1aSJeff Kirsher  * s2io.h: A Linux PCI-X Ethernet driver for Neterion 10GbE Server NIC
386387e1aSJeff Kirsher  * Copyright(c) 2002-2010 Exar Corp.
486387e1aSJeff Kirsher 
586387e1aSJeff Kirsher  * This software may be used and distributed according to the terms of
686387e1aSJeff Kirsher  * the GNU General Public License (GPL), incorporated herein by reference.
786387e1aSJeff Kirsher  * Drivers based on or derived from this code fall under the GPL and must
886387e1aSJeff Kirsher  * retain the authorship, copyright and license notice.  This file is not
986387e1aSJeff Kirsher  * a complete program and may only be used when the entire operating
1086387e1aSJeff Kirsher  * system is licensed under the GPL.
1186387e1aSJeff Kirsher  * See the file COPYING in this distribution for more information.
1286387e1aSJeff Kirsher  ************************************************************************/
132208e9a7SCorentin Labbe #include <linux/io-64-nonatomic-lo-hi.h>
1486387e1aSJeff Kirsher #ifndef _S2IO_H
1586387e1aSJeff Kirsher #define _S2IO_H
1686387e1aSJeff Kirsher 
1786387e1aSJeff Kirsher #define TBD 0
1886387e1aSJeff Kirsher #define s2BIT(loc)		(0x8000000000000000ULL >> (loc))
1986387e1aSJeff Kirsher #define vBIT(val, loc, sz)	(((u64)val) << (64-loc-sz))
2086387e1aSJeff Kirsher #define INV(d)  ((d&0xff)<<24) | (((d>>8)&0xff)<<16) | (((d>>16)&0xff)<<8)| ((d>>24)&0xff)
2186387e1aSJeff Kirsher 
2286387e1aSJeff Kirsher #undef SUCCESS
2386387e1aSJeff Kirsher #define SUCCESS 0
2486387e1aSJeff Kirsher #define FAILURE -1
2586387e1aSJeff Kirsher #define S2IO_MINUS_ONE 0xFFFFFFFFFFFFFFFFULL
2686387e1aSJeff Kirsher #define S2IO_DISABLE_MAC_ENTRY 0xFFFFFFFFFFFFULL
2786387e1aSJeff Kirsher #define S2IO_MAX_PCI_CONFIG_SPACE_REINIT 100
2886387e1aSJeff Kirsher #define S2IO_BIT_RESET 1
2986387e1aSJeff Kirsher #define S2IO_BIT_SET 2
3086387e1aSJeff Kirsher #define CHECKBIT(value, nbit) (value & (1 << nbit))
3186387e1aSJeff Kirsher 
3286387e1aSJeff Kirsher /* Maximum time to flicker LED when asked to identify NIC using ethtool */
3386387e1aSJeff Kirsher #define MAX_FLICKER_TIME	60000 /* 60 Secs */
3486387e1aSJeff Kirsher 
3586387e1aSJeff Kirsher /* Maximum outstanding splits to be configured into xena. */
3686387e1aSJeff Kirsher enum {
3786387e1aSJeff Kirsher 	XENA_ONE_SPLIT_TRANSACTION = 0,
3886387e1aSJeff Kirsher 	XENA_TWO_SPLIT_TRANSACTION = 1,
3986387e1aSJeff Kirsher 	XENA_THREE_SPLIT_TRANSACTION = 2,
4086387e1aSJeff Kirsher 	XENA_FOUR_SPLIT_TRANSACTION = 3,
4186387e1aSJeff Kirsher 	XENA_EIGHT_SPLIT_TRANSACTION = 4,
4286387e1aSJeff Kirsher 	XENA_TWELVE_SPLIT_TRANSACTION = 5,
4386387e1aSJeff Kirsher 	XENA_SIXTEEN_SPLIT_TRANSACTION = 6,
4486387e1aSJeff Kirsher 	XENA_THIRTYTWO_SPLIT_TRANSACTION = 7
4586387e1aSJeff Kirsher };
4686387e1aSJeff Kirsher #define XENA_MAX_OUTSTANDING_SPLITS(n) (n << 4)
4786387e1aSJeff Kirsher 
4886387e1aSJeff Kirsher /*  OS concerned variables and constants */
4986387e1aSJeff Kirsher #define WATCH_DOG_TIMEOUT		15*HZ
5086387e1aSJeff Kirsher #define EFILL				0x1234
5186387e1aSJeff Kirsher #define ALIGN_SIZE			127
5286387e1aSJeff Kirsher #define	PCIX_COMMAND_REGISTER		0x62
5386387e1aSJeff Kirsher 
5486387e1aSJeff Kirsher /*
5586387e1aSJeff Kirsher  * Debug related variables.
5686387e1aSJeff Kirsher  */
5786387e1aSJeff Kirsher /* different debug levels. */
5886387e1aSJeff Kirsher #define	ERR_DBG		0
5986387e1aSJeff Kirsher #define	INIT_DBG	1
6086387e1aSJeff Kirsher #define	INFO_DBG	2
6186387e1aSJeff Kirsher #define	TX_DBG		3
6286387e1aSJeff Kirsher #define	INTR_DBG	4
6386387e1aSJeff Kirsher 
6486387e1aSJeff Kirsher /* Global variable that defines the present debug level of the driver. */
6586387e1aSJeff Kirsher static int debug_level = ERR_DBG;
6686387e1aSJeff Kirsher 
6786387e1aSJeff Kirsher /* DEBUG message print. */
6886387e1aSJeff Kirsher #define DBG_PRINT(dbg_level, fmt, args...) do {			\
6986387e1aSJeff Kirsher 	if (dbg_level <= debug_level)				\
7086387e1aSJeff Kirsher 		pr_info(fmt, ##args);				\
7186387e1aSJeff Kirsher 	} while (0)
7286387e1aSJeff Kirsher 
7386387e1aSJeff Kirsher /* Protocol assist features of the NIC */
7486387e1aSJeff Kirsher #define L3_CKSUM_OK 0xFFFF
7586387e1aSJeff Kirsher #define L4_CKSUM_OK 0xFFFF
7686387e1aSJeff Kirsher #define S2IO_JUMBO_SIZE 9600
7786387e1aSJeff Kirsher 
7886387e1aSJeff Kirsher /* Driver statistics maintained by driver */
7986387e1aSJeff Kirsher struct swStat {
8086387e1aSJeff Kirsher 	unsigned long long single_ecc_errs;
8186387e1aSJeff Kirsher 	unsigned long long double_ecc_errs;
8286387e1aSJeff Kirsher 	unsigned long long parity_err_cnt;
8386387e1aSJeff Kirsher 	unsigned long long serious_err_cnt;
8486387e1aSJeff Kirsher 	unsigned long long soft_reset_cnt;
8586387e1aSJeff Kirsher 	unsigned long long fifo_full_cnt;
8686387e1aSJeff Kirsher 	unsigned long long ring_full_cnt[8];
8786387e1aSJeff Kirsher 	/* LRO statistics */
8886387e1aSJeff Kirsher 	unsigned long long clubbed_frms_cnt;
8986387e1aSJeff Kirsher 	unsigned long long sending_both;
9086387e1aSJeff Kirsher 	unsigned long long outof_sequence_pkts;
9186387e1aSJeff Kirsher 	unsigned long long flush_max_pkts;
9286387e1aSJeff Kirsher 	unsigned long long sum_avg_pkts_aggregated;
9386387e1aSJeff Kirsher 	unsigned long long num_aggregations;
9486387e1aSJeff Kirsher 	/* Other statistics */
9586387e1aSJeff Kirsher 	unsigned long long mem_alloc_fail_cnt;
9686387e1aSJeff Kirsher 	unsigned long long pci_map_fail_cnt;
9786387e1aSJeff Kirsher 	unsigned long long watchdog_timer_cnt;
9886387e1aSJeff Kirsher 	unsigned long long mem_allocated;
9986387e1aSJeff Kirsher 	unsigned long long mem_freed;
10086387e1aSJeff Kirsher 	unsigned long long link_up_cnt;
10186387e1aSJeff Kirsher 	unsigned long long link_down_cnt;
10286387e1aSJeff Kirsher 	unsigned long long link_up_time;
10386387e1aSJeff Kirsher 	unsigned long long link_down_time;
10486387e1aSJeff Kirsher 
10586387e1aSJeff Kirsher 	/* Transfer Code statistics */
10686387e1aSJeff Kirsher 	unsigned long long tx_buf_abort_cnt;
10786387e1aSJeff Kirsher 	unsigned long long tx_desc_abort_cnt;
10886387e1aSJeff Kirsher 	unsigned long long tx_parity_err_cnt;
10986387e1aSJeff Kirsher 	unsigned long long tx_link_loss_cnt;
11086387e1aSJeff Kirsher 	unsigned long long tx_list_proc_err_cnt;
11186387e1aSJeff Kirsher 
11286387e1aSJeff Kirsher 	unsigned long long rx_parity_err_cnt;
11386387e1aSJeff Kirsher 	unsigned long long rx_abort_cnt;
11486387e1aSJeff Kirsher 	unsigned long long rx_parity_abort_cnt;
11586387e1aSJeff Kirsher 	unsigned long long rx_rda_fail_cnt;
11686387e1aSJeff Kirsher 	unsigned long long rx_unkn_prot_cnt;
11786387e1aSJeff Kirsher 	unsigned long long rx_fcs_err_cnt;
11886387e1aSJeff Kirsher 	unsigned long long rx_buf_size_err_cnt;
11986387e1aSJeff Kirsher 	unsigned long long rx_rxd_corrupt_cnt;
12086387e1aSJeff Kirsher 	unsigned long long rx_unkn_err_cnt;
12186387e1aSJeff Kirsher 
12286387e1aSJeff Kirsher 	/* Error/alarm statistics*/
12386387e1aSJeff Kirsher 	unsigned long long tda_err_cnt;
12486387e1aSJeff Kirsher 	unsigned long long pfc_err_cnt;
12586387e1aSJeff Kirsher 	unsigned long long pcc_err_cnt;
12686387e1aSJeff Kirsher 	unsigned long long tti_err_cnt;
12786387e1aSJeff Kirsher 	unsigned long long lso_err_cnt;
12886387e1aSJeff Kirsher 	unsigned long long tpa_err_cnt;
12986387e1aSJeff Kirsher 	unsigned long long sm_err_cnt;
13086387e1aSJeff Kirsher 	unsigned long long mac_tmac_err_cnt;
13186387e1aSJeff Kirsher 	unsigned long long mac_rmac_err_cnt;
13286387e1aSJeff Kirsher 	unsigned long long xgxs_txgxs_err_cnt;
13386387e1aSJeff Kirsher 	unsigned long long xgxs_rxgxs_err_cnt;
13486387e1aSJeff Kirsher 	unsigned long long rc_err_cnt;
13586387e1aSJeff Kirsher 	unsigned long long prc_pcix_err_cnt;
13686387e1aSJeff Kirsher 	unsigned long long rpa_err_cnt;
13786387e1aSJeff Kirsher 	unsigned long long rda_err_cnt;
13886387e1aSJeff Kirsher 	unsigned long long rti_err_cnt;
13986387e1aSJeff Kirsher 	unsigned long long mc_err_cnt;
14086387e1aSJeff Kirsher 
14186387e1aSJeff Kirsher };
14286387e1aSJeff Kirsher 
14386387e1aSJeff Kirsher /* Xpak releated alarm and warnings */
14486387e1aSJeff Kirsher struct xpakStat {
14586387e1aSJeff Kirsher 	u64 alarm_transceiver_temp_high;
14686387e1aSJeff Kirsher 	u64 alarm_transceiver_temp_low;
14786387e1aSJeff Kirsher 	u64 alarm_laser_bias_current_high;
14886387e1aSJeff Kirsher 	u64 alarm_laser_bias_current_low;
14986387e1aSJeff Kirsher 	u64 alarm_laser_output_power_high;
15086387e1aSJeff Kirsher 	u64 alarm_laser_output_power_low;
15186387e1aSJeff Kirsher 	u64 warn_transceiver_temp_high;
15286387e1aSJeff Kirsher 	u64 warn_transceiver_temp_low;
15386387e1aSJeff Kirsher 	u64 warn_laser_bias_current_high;
15486387e1aSJeff Kirsher 	u64 warn_laser_bias_current_low;
15586387e1aSJeff Kirsher 	u64 warn_laser_output_power_high;
15686387e1aSJeff Kirsher 	u64 warn_laser_output_power_low;
15786387e1aSJeff Kirsher 	u64 xpak_regs_stat;
15886387e1aSJeff Kirsher 	u32 xpak_timer_count;
15986387e1aSJeff Kirsher };
16086387e1aSJeff Kirsher 
16186387e1aSJeff Kirsher 
16286387e1aSJeff Kirsher /* The statistics block of Xena */
16386387e1aSJeff Kirsher struct stat_block {
16486387e1aSJeff Kirsher /* Tx MAC statistics counters. */
16586387e1aSJeff Kirsher 	__le32 tmac_data_octets;
16686387e1aSJeff Kirsher 	__le32 tmac_frms;
16786387e1aSJeff Kirsher 	__le64 tmac_drop_frms;
16886387e1aSJeff Kirsher 	__le32 tmac_bcst_frms;
16986387e1aSJeff Kirsher 	__le32 tmac_mcst_frms;
17086387e1aSJeff Kirsher 	__le64 tmac_pause_ctrl_frms;
17186387e1aSJeff Kirsher 	__le32 tmac_ucst_frms;
17286387e1aSJeff Kirsher 	__le32 tmac_ttl_octets;
17386387e1aSJeff Kirsher 	__le32 tmac_any_err_frms;
17486387e1aSJeff Kirsher 	__le32 tmac_nucst_frms;
17586387e1aSJeff Kirsher 	__le64 tmac_ttl_less_fb_octets;
17686387e1aSJeff Kirsher 	__le64 tmac_vld_ip_octets;
17786387e1aSJeff Kirsher 	__le32 tmac_drop_ip;
17886387e1aSJeff Kirsher 	__le32 tmac_vld_ip;
17986387e1aSJeff Kirsher 	__le32 tmac_rst_tcp;
18086387e1aSJeff Kirsher 	__le32 tmac_icmp;
18186387e1aSJeff Kirsher 	__le64 tmac_tcp;
18286387e1aSJeff Kirsher 	__le32 reserved_0;
18386387e1aSJeff Kirsher 	__le32 tmac_udp;
18486387e1aSJeff Kirsher 
18586387e1aSJeff Kirsher /* Rx MAC Statistics counters. */
18686387e1aSJeff Kirsher 	__le32 rmac_data_octets;
18786387e1aSJeff Kirsher 	__le32 rmac_vld_frms;
18886387e1aSJeff Kirsher 	__le64 rmac_fcs_err_frms;
18986387e1aSJeff Kirsher 	__le64 rmac_drop_frms;
19086387e1aSJeff Kirsher 	__le32 rmac_vld_bcst_frms;
19186387e1aSJeff Kirsher 	__le32 rmac_vld_mcst_frms;
19286387e1aSJeff Kirsher 	__le32 rmac_out_rng_len_err_frms;
19386387e1aSJeff Kirsher 	__le32 rmac_in_rng_len_err_frms;
19486387e1aSJeff Kirsher 	__le64 rmac_long_frms;
19586387e1aSJeff Kirsher 	__le64 rmac_pause_ctrl_frms;
19686387e1aSJeff Kirsher 	__le64 rmac_unsup_ctrl_frms;
19786387e1aSJeff Kirsher 	__le32 rmac_accepted_ucst_frms;
19886387e1aSJeff Kirsher 	__le32 rmac_ttl_octets;
19986387e1aSJeff Kirsher 	__le32 rmac_discarded_frms;
20086387e1aSJeff Kirsher 	__le32 rmac_accepted_nucst_frms;
20186387e1aSJeff Kirsher 	__le32 reserved_1;
20286387e1aSJeff Kirsher 	__le32 rmac_drop_events;
20386387e1aSJeff Kirsher 	__le64 rmac_ttl_less_fb_octets;
20486387e1aSJeff Kirsher 	__le64 rmac_ttl_frms;
20586387e1aSJeff Kirsher 	__le64 reserved_2;
20686387e1aSJeff Kirsher 	__le32 rmac_usized_frms;
20786387e1aSJeff Kirsher 	__le32 reserved_3;
20886387e1aSJeff Kirsher 	__le32 rmac_frag_frms;
20986387e1aSJeff Kirsher 	__le32 rmac_osized_frms;
21086387e1aSJeff Kirsher 	__le32 reserved_4;
21186387e1aSJeff Kirsher 	__le32 rmac_jabber_frms;
21286387e1aSJeff Kirsher 	__le64 rmac_ttl_64_frms;
21386387e1aSJeff Kirsher 	__le64 rmac_ttl_65_127_frms;
21486387e1aSJeff Kirsher 	__le64 reserved_5;
21586387e1aSJeff Kirsher 	__le64 rmac_ttl_128_255_frms;
21686387e1aSJeff Kirsher 	__le64 rmac_ttl_256_511_frms;
21786387e1aSJeff Kirsher 	__le64 reserved_6;
21886387e1aSJeff Kirsher 	__le64 rmac_ttl_512_1023_frms;
21986387e1aSJeff Kirsher 	__le64 rmac_ttl_1024_1518_frms;
22086387e1aSJeff Kirsher 	__le32 rmac_ip;
22186387e1aSJeff Kirsher 	__le32 reserved_7;
22286387e1aSJeff Kirsher 	__le64 rmac_ip_octets;
22386387e1aSJeff Kirsher 	__le32 rmac_drop_ip;
22486387e1aSJeff Kirsher 	__le32 rmac_hdr_err_ip;
22586387e1aSJeff Kirsher 	__le32 reserved_8;
22686387e1aSJeff Kirsher 	__le32 rmac_icmp;
22786387e1aSJeff Kirsher 	__le64 rmac_tcp;
22886387e1aSJeff Kirsher 	__le32 rmac_err_drp_udp;
22986387e1aSJeff Kirsher 	__le32 rmac_udp;
23086387e1aSJeff Kirsher 	__le64 rmac_xgmii_err_sym;
23186387e1aSJeff Kirsher 	__le64 rmac_frms_q0;
23286387e1aSJeff Kirsher 	__le64 rmac_frms_q1;
23386387e1aSJeff Kirsher 	__le64 rmac_frms_q2;
23486387e1aSJeff Kirsher 	__le64 rmac_frms_q3;
23586387e1aSJeff Kirsher 	__le64 rmac_frms_q4;
23686387e1aSJeff Kirsher 	__le64 rmac_frms_q5;
23786387e1aSJeff Kirsher 	__le64 rmac_frms_q6;
23886387e1aSJeff Kirsher 	__le64 rmac_frms_q7;
23986387e1aSJeff Kirsher 	__le16 rmac_full_q3;
24086387e1aSJeff Kirsher 	__le16 rmac_full_q2;
24186387e1aSJeff Kirsher 	__le16 rmac_full_q1;
24286387e1aSJeff Kirsher 	__le16 rmac_full_q0;
24386387e1aSJeff Kirsher 	__le16 rmac_full_q7;
24486387e1aSJeff Kirsher 	__le16 rmac_full_q6;
24586387e1aSJeff Kirsher 	__le16 rmac_full_q5;
24686387e1aSJeff Kirsher 	__le16 rmac_full_q4;
24786387e1aSJeff Kirsher 	__le32 reserved_9;
24886387e1aSJeff Kirsher 	__le32 rmac_pause_cnt;
24986387e1aSJeff Kirsher 	__le64 rmac_xgmii_data_err_cnt;
25086387e1aSJeff Kirsher 	__le64 rmac_xgmii_ctrl_err_cnt;
25186387e1aSJeff Kirsher 	__le32 rmac_err_tcp;
25286387e1aSJeff Kirsher 	__le32 rmac_accepted_ip;
25386387e1aSJeff Kirsher 
25486387e1aSJeff Kirsher /* PCI/PCI-X Read transaction statistics. */
25586387e1aSJeff Kirsher 	__le32 new_rd_req_cnt;
25686387e1aSJeff Kirsher 	__le32 rd_req_cnt;
25786387e1aSJeff Kirsher 	__le32 rd_rtry_cnt;
25886387e1aSJeff Kirsher 	__le32 new_rd_req_rtry_cnt;
25986387e1aSJeff Kirsher 
26086387e1aSJeff Kirsher /* PCI/PCI-X Write/Read transaction statistics. */
26186387e1aSJeff Kirsher 	__le32 wr_req_cnt;
26286387e1aSJeff Kirsher 	__le32 wr_rtry_rd_ack_cnt;
26386387e1aSJeff Kirsher 	__le32 new_wr_req_rtry_cnt;
26486387e1aSJeff Kirsher 	__le32 new_wr_req_cnt;
26586387e1aSJeff Kirsher 	__le32 wr_disc_cnt;
26686387e1aSJeff Kirsher 	__le32 wr_rtry_cnt;
26786387e1aSJeff Kirsher 
26886387e1aSJeff Kirsher /*	PCI/PCI-X Write / DMA Transaction statistics. */
26986387e1aSJeff Kirsher 	__le32 txp_wr_cnt;
27086387e1aSJeff Kirsher 	__le32 rd_rtry_wr_ack_cnt;
27186387e1aSJeff Kirsher 	__le32 txd_wr_cnt;
27286387e1aSJeff Kirsher 	__le32 txd_rd_cnt;
27386387e1aSJeff Kirsher 	__le32 rxd_wr_cnt;
27486387e1aSJeff Kirsher 	__le32 rxd_rd_cnt;
27586387e1aSJeff Kirsher 	__le32 rxf_wr_cnt;
27686387e1aSJeff Kirsher 	__le32 txf_rd_cnt;
27786387e1aSJeff Kirsher 
27886387e1aSJeff Kirsher /* Tx MAC statistics overflow counters. */
27986387e1aSJeff Kirsher 	__le32 tmac_data_octets_oflow;
28086387e1aSJeff Kirsher 	__le32 tmac_frms_oflow;
28186387e1aSJeff Kirsher 	__le32 tmac_bcst_frms_oflow;
28286387e1aSJeff Kirsher 	__le32 tmac_mcst_frms_oflow;
28386387e1aSJeff Kirsher 	__le32 tmac_ucst_frms_oflow;
28486387e1aSJeff Kirsher 	__le32 tmac_ttl_octets_oflow;
28586387e1aSJeff Kirsher 	__le32 tmac_any_err_frms_oflow;
28686387e1aSJeff Kirsher 	__le32 tmac_nucst_frms_oflow;
28786387e1aSJeff Kirsher 	__le64 tmac_vlan_frms;
28886387e1aSJeff Kirsher 	__le32 tmac_drop_ip_oflow;
28986387e1aSJeff Kirsher 	__le32 tmac_vld_ip_oflow;
29086387e1aSJeff Kirsher 	__le32 tmac_rst_tcp_oflow;
29186387e1aSJeff Kirsher 	__le32 tmac_icmp_oflow;
29286387e1aSJeff Kirsher 	__le32 tpa_unknown_protocol;
29386387e1aSJeff Kirsher 	__le32 tmac_udp_oflow;
29486387e1aSJeff Kirsher 	__le32 reserved_10;
29586387e1aSJeff Kirsher 	__le32 tpa_parse_failure;
29686387e1aSJeff Kirsher 
29786387e1aSJeff Kirsher /* Rx MAC Statistics overflow counters. */
29886387e1aSJeff Kirsher 	__le32 rmac_data_octets_oflow;
29986387e1aSJeff Kirsher 	__le32 rmac_vld_frms_oflow;
30086387e1aSJeff Kirsher 	__le32 rmac_vld_bcst_frms_oflow;
30186387e1aSJeff Kirsher 	__le32 rmac_vld_mcst_frms_oflow;
30286387e1aSJeff Kirsher 	__le32 rmac_accepted_ucst_frms_oflow;
30386387e1aSJeff Kirsher 	__le32 rmac_ttl_octets_oflow;
30486387e1aSJeff Kirsher 	__le32 rmac_discarded_frms_oflow;
30586387e1aSJeff Kirsher 	__le32 rmac_accepted_nucst_frms_oflow;
30686387e1aSJeff Kirsher 	__le32 rmac_usized_frms_oflow;
30786387e1aSJeff Kirsher 	__le32 rmac_drop_events_oflow;
30886387e1aSJeff Kirsher 	__le32 rmac_frag_frms_oflow;
30986387e1aSJeff Kirsher 	__le32 rmac_osized_frms_oflow;
31086387e1aSJeff Kirsher 	__le32 rmac_ip_oflow;
31186387e1aSJeff Kirsher 	__le32 rmac_jabber_frms_oflow;
31286387e1aSJeff Kirsher 	__le32 rmac_icmp_oflow;
31386387e1aSJeff Kirsher 	__le32 rmac_drop_ip_oflow;
31486387e1aSJeff Kirsher 	__le32 rmac_err_drp_udp_oflow;
31586387e1aSJeff Kirsher 	__le32 rmac_udp_oflow;
31686387e1aSJeff Kirsher 	__le32 reserved_11;
31786387e1aSJeff Kirsher 	__le32 rmac_pause_cnt_oflow;
31886387e1aSJeff Kirsher 	__le64 rmac_ttl_1519_4095_frms;
31986387e1aSJeff Kirsher 	__le64 rmac_ttl_4096_8191_frms;
32086387e1aSJeff Kirsher 	__le64 rmac_ttl_8192_max_frms;
32186387e1aSJeff Kirsher 	__le64 rmac_ttl_gt_max_frms;
32286387e1aSJeff Kirsher 	__le64 rmac_osized_alt_frms;
32386387e1aSJeff Kirsher 	__le64 rmac_jabber_alt_frms;
32486387e1aSJeff Kirsher 	__le64 rmac_gt_max_alt_frms;
32586387e1aSJeff Kirsher 	__le64 rmac_vlan_frms;
32686387e1aSJeff Kirsher 	__le32 rmac_len_discard;
32786387e1aSJeff Kirsher 	__le32 rmac_fcs_discard;
32886387e1aSJeff Kirsher 	__le32 rmac_pf_discard;
32986387e1aSJeff Kirsher 	__le32 rmac_da_discard;
33086387e1aSJeff Kirsher 	__le32 rmac_red_discard;
33186387e1aSJeff Kirsher 	__le32 rmac_rts_discard;
33286387e1aSJeff Kirsher 	__le32 reserved_12;
33386387e1aSJeff Kirsher 	__le32 rmac_ingm_full_discard;
33486387e1aSJeff Kirsher 	__le32 reserved_13;
33586387e1aSJeff Kirsher 	__le32 rmac_accepted_ip_oflow;
33686387e1aSJeff Kirsher 	__le32 reserved_14;
33786387e1aSJeff Kirsher 	__le32 link_fault_cnt;
33886387e1aSJeff Kirsher 	u8  buffer[20];
33986387e1aSJeff Kirsher 	struct swStat sw_stat;
34086387e1aSJeff Kirsher 	struct xpakStat xpak_stat;
34186387e1aSJeff Kirsher };
34286387e1aSJeff Kirsher 
34386387e1aSJeff Kirsher /* Default value for 'vlan_strip_tag' configuration parameter */
34486387e1aSJeff Kirsher #define NO_STRIP_IN_PROMISC 2
34586387e1aSJeff Kirsher 
34686387e1aSJeff Kirsher /*
34786387e1aSJeff Kirsher  * Structures representing different init time configuration
34886387e1aSJeff Kirsher  * parameters of the NIC.
34986387e1aSJeff Kirsher  */
35086387e1aSJeff Kirsher 
35186387e1aSJeff Kirsher #define MAX_TX_FIFOS 8
35286387e1aSJeff Kirsher #define MAX_RX_RINGS 8
35386387e1aSJeff Kirsher 
35486387e1aSJeff Kirsher #define FIFO_DEFAULT_NUM	5
35586387e1aSJeff Kirsher #define FIFO_UDP_MAX_NUM			2 /* 0 - even, 1 -odd ports */
35686387e1aSJeff Kirsher #define FIFO_OTHER_MAX_NUM			1
35786387e1aSJeff Kirsher 
35886387e1aSJeff Kirsher 
35986387e1aSJeff Kirsher #define MAX_RX_DESC_1  (MAX_RX_RINGS * MAX_RX_BLOCKS_PER_RING * 128)
36086387e1aSJeff Kirsher #define MAX_RX_DESC_2  (MAX_RX_RINGS * MAX_RX_BLOCKS_PER_RING * 86)
36186387e1aSJeff Kirsher #define MAX_TX_DESC    (MAX_AVAILABLE_TXDS)
36286387e1aSJeff Kirsher 
36386387e1aSJeff Kirsher /* FIFO mappings for all possible number of fifos configured */
36486387e1aSJeff Kirsher static const int fifo_map[][MAX_TX_FIFOS] = {
36586387e1aSJeff Kirsher 	{0, 0, 0, 0, 0, 0, 0, 0},
36686387e1aSJeff Kirsher 	{0, 0, 0, 0, 1, 1, 1, 1},
36786387e1aSJeff Kirsher 	{0, 0, 0, 1, 1, 1, 2, 2},
36886387e1aSJeff Kirsher 	{0, 0, 1, 1, 2, 2, 3, 3},
36986387e1aSJeff Kirsher 	{0, 0, 1, 1, 2, 2, 3, 4},
37086387e1aSJeff Kirsher 	{0, 0, 1, 1, 2, 3, 4, 5},
37186387e1aSJeff Kirsher 	{0, 0, 1, 2, 3, 4, 5, 6},
37286387e1aSJeff Kirsher 	{0, 1, 2, 3, 4, 5, 6, 7},
37386387e1aSJeff Kirsher };
37486387e1aSJeff Kirsher 
37586387e1aSJeff Kirsher static const u16 fifo_selector[MAX_TX_FIFOS] = {0, 1, 3, 3, 7, 7, 7, 7};
37686387e1aSJeff Kirsher 
37786387e1aSJeff Kirsher /* Maintains Per FIFO related information. */
37886387e1aSJeff Kirsher struct tx_fifo_config {
37986387e1aSJeff Kirsher #define	MAX_AVAILABLE_TXDS	8192
38086387e1aSJeff Kirsher 	u32 fifo_len;		/* specifies len of FIFO up to 8192, ie no of TxDLs */
38186387e1aSJeff Kirsher /* Priority definition */
38286387e1aSJeff Kirsher #define TX_FIFO_PRI_0               0	/*Highest */
38386387e1aSJeff Kirsher #define TX_FIFO_PRI_1               1
38486387e1aSJeff Kirsher #define TX_FIFO_PRI_2               2
38586387e1aSJeff Kirsher #define TX_FIFO_PRI_3               3
38686387e1aSJeff Kirsher #define TX_FIFO_PRI_4               4
38786387e1aSJeff Kirsher #define TX_FIFO_PRI_5               5
38886387e1aSJeff Kirsher #define TX_FIFO_PRI_6               6
38986387e1aSJeff Kirsher #define TX_FIFO_PRI_7               7	/*lowest */
39086387e1aSJeff Kirsher 	u8 fifo_priority;	/* specifies pointer level for FIFO */
39186387e1aSJeff Kirsher 	/* user should not set twos fifos with same pri */
39286387e1aSJeff Kirsher 	u8 f_no_snoop;
39386387e1aSJeff Kirsher #define NO_SNOOP_TXD                0x01
39486387e1aSJeff Kirsher #define NO_SNOOP_TXD_BUFFER          0x02
39586387e1aSJeff Kirsher };
39686387e1aSJeff Kirsher 
39786387e1aSJeff Kirsher 
39886387e1aSJeff Kirsher /* Maintains per Ring related information */
39986387e1aSJeff Kirsher struct rx_ring_config {
40086387e1aSJeff Kirsher 	u32 num_rxd;		/*No of RxDs per Rx Ring */
40186387e1aSJeff Kirsher #define RX_RING_PRI_0               0	/* highest */
40286387e1aSJeff Kirsher #define RX_RING_PRI_1               1
40386387e1aSJeff Kirsher #define RX_RING_PRI_2               2
40486387e1aSJeff Kirsher #define RX_RING_PRI_3               3
40586387e1aSJeff Kirsher #define RX_RING_PRI_4               4
40686387e1aSJeff Kirsher #define RX_RING_PRI_5               5
40786387e1aSJeff Kirsher #define RX_RING_PRI_6               6
40886387e1aSJeff Kirsher #define RX_RING_PRI_7               7	/* lowest */
40986387e1aSJeff Kirsher 
41086387e1aSJeff Kirsher 	u8 ring_priority;	/*Specifies service priority of ring */
41186387e1aSJeff Kirsher 	/* OSM should not set any two rings with same priority */
41286387e1aSJeff Kirsher 	u8 ring_org;		/*Organization of ring */
41386387e1aSJeff Kirsher #define RING_ORG_BUFF1		0x01
41486387e1aSJeff Kirsher #define RX_RING_ORG_BUFF3	0x03
41586387e1aSJeff Kirsher #define RX_RING_ORG_BUFF5	0x05
41686387e1aSJeff Kirsher 
41786387e1aSJeff Kirsher 	u8 f_no_snoop;
41886387e1aSJeff Kirsher #define NO_SNOOP_RXD                0x01
41986387e1aSJeff Kirsher #define NO_SNOOP_RXD_BUFFER         0x02
42086387e1aSJeff Kirsher };
42186387e1aSJeff Kirsher 
42286387e1aSJeff Kirsher /* This structure provides contains values of the tunable parameters
42386387e1aSJeff Kirsher  * of the H/W
42486387e1aSJeff Kirsher  */
42586387e1aSJeff Kirsher struct config_param {
42686387e1aSJeff Kirsher /* Tx Side */
42786387e1aSJeff Kirsher 	u32 tx_fifo_num;	/*Number of Tx FIFOs */
42886387e1aSJeff Kirsher 
42986387e1aSJeff Kirsher 	/* 0-No steering, 1-Priority steering, 2-Default fifo map */
43086387e1aSJeff Kirsher #define	NO_STEERING				0
43186387e1aSJeff Kirsher #define	TX_PRIORITY_STEERING			0x1
43286387e1aSJeff Kirsher #define TX_DEFAULT_STEERING 			0x2
43386387e1aSJeff Kirsher 	u8 tx_steering_type;
43486387e1aSJeff Kirsher 
43586387e1aSJeff Kirsher 	u8 fifo_mapping[MAX_TX_FIFOS];
43686387e1aSJeff Kirsher 	struct tx_fifo_config tx_cfg[MAX_TX_FIFOS];	/*Per-Tx FIFO config */
43786387e1aSJeff Kirsher 	u32 max_txds;		/*Max no. of Tx buffer descriptor per TxDL */
43886387e1aSJeff Kirsher 	u64 tx_intr_type;
43986387e1aSJeff Kirsher #define INTA	0
44086387e1aSJeff Kirsher #define MSI_X	2
44186387e1aSJeff Kirsher 	u8 intr_type;
44286387e1aSJeff Kirsher 	u8 napi;
44386387e1aSJeff Kirsher 
44486387e1aSJeff Kirsher 	/* Specifies if Tx Intr is UTILZ or PER_LIST type. */
44586387e1aSJeff Kirsher 
44686387e1aSJeff Kirsher /* Rx Side */
44786387e1aSJeff Kirsher 	u32 rx_ring_num;	/*Number of receive rings */
44886387e1aSJeff Kirsher #define MAX_RX_BLOCKS_PER_RING  150
44986387e1aSJeff Kirsher 
45086387e1aSJeff Kirsher 	struct rx_ring_config rx_cfg[MAX_RX_RINGS];	/*Per-Rx Ring config */
45186387e1aSJeff Kirsher 
45286387e1aSJeff Kirsher #define HEADER_ETHERNET_II_802_3_SIZE 14
45386387e1aSJeff Kirsher #define HEADER_802_2_SIZE              3
45486387e1aSJeff Kirsher #define HEADER_SNAP_SIZE               5
45586387e1aSJeff Kirsher #define HEADER_VLAN_SIZE               4
45686387e1aSJeff Kirsher 
45786387e1aSJeff Kirsher #define MIN_MTU                       46
45886387e1aSJeff Kirsher #define MAX_PYLD                    1500
45986387e1aSJeff Kirsher #define MAX_MTU                     (MAX_PYLD+18)
46086387e1aSJeff Kirsher #define MAX_MTU_VLAN                (MAX_PYLD+22)
46186387e1aSJeff Kirsher #define MAX_PYLD_JUMBO              9600
46286387e1aSJeff Kirsher #define MAX_MTU_JUMBO               (MAX_PYLD_JUMBO+18)
46386387e1aSJeff Kirsher #define MAX_MTU_JUMBO_VLAN          (MAX_PYLD_JUMBO+22)
46486387e1aSJeff Kirsher 	u16 bus_speed;
46586387e1aSJeff Kirsher 	int max_mc_addr;	/* xena=64 herc=256 */
46686387e1aSJeff Kirsher 	int max_mac_addr;	/* xena=16 herc=64 */
46786387e1aSJeff Kirsher 	int mc_start_offset;	/* xena=16 herc=64 */
46886387e1aSJeff Kirsher 	u8 multiq;
46986387e1aSJeff Kirsher };
47086387e1aSJeff Kirsher 
47186387e1aSJeff Kirsher /* Structure representing MAC Addrs */
47286387e1aSJeff Kirsher struct mac_addr {
47386387e1aSJeff Kirsher 	u8 mac_addr[ETH_ALEN];
47486387e1aSJeff Kirsher };
47586387e1aSJeff Kirsher 
47686387e1aSJeff Kirsher /* Structure that represent every FIFO element in the BAR1
47786387e1aSJeff Kirsher  * Address location.
47886387e1aSJeff Kirsher  */
47986387e1aSJeff Kirsher struct TxFIFO_element {
48086387e1aSJeff Kirsher 	u64 TxDL_Pointer;
48186387e1aSJeff Kirsher 
48286387e1aSJeff Kirsher 	u64 List_Control;
48386387e1aSJeff Kirsher #define TX_FIFO_LAST_TXD_NUM( val)     vBIT(val,0,8)
48486387e1aSJeff Kirsher #define TX_FIFO_FIRST_LIST             s2BIT(14)
48586387e1aSJeff Kirsher #define TX_FIFO_LAST_LIST              s2BIT(15)
48686387e1aSJeff Kirsher #define TX_FIFO_FIRSTNLAST_LIST        vBIT(3,14,2)
48786387e1aSJeff Kirsher #define TX_FIFO_SPECIAL_FUNC           s2BIT(23)
48886387e1aSJeff Kirsher #define TX_FIFO_DS_NO_SNOOP            s2BIT(31)
48986387e1aSJeff Kirsher #define TX_FIFO_BUFF_NO_SNOOP          s2BIT(30)
49086387e1aSJeff Kirsher };
49186387e1aSJeff Kirsher 
49286387e1aSJeff Kirsher /* Tx descriptor structure */
49386387e1aSJeff Kirsher struct TxD {
49486387e1aSJeff Kirsher 	u64 Control_1;
49586387e1aSJeff Kirsher /* bit mask */
49686387e1aSJeff Kirsher #define TXD_LIST_OWN_XENA       s2BIT(7)
49786387e1aSJeff Kirsher #define TXD_T_CODE              (s2BIT(12)|s2BIT(13)|s2BIT(14)|s2BIT(15))
49886387e1aSJeff Kirsher #define TXD_T_CODE_OK(val)      (|(val & TXD_T_CODE))
49986387e1aSJeff Kirsher #define GET_TXD_T_CODE(val)     ((val & TXD_T_CODE)<<12)
50086387e1aSJeff Kirsher #define TXD_GATHER_CODE         (s2BIT(22) | s2BIT(23))
50186387e1aSJeff Kirsher #define TXD_GATHER_CODE_FIRST   s2BIT(22)
50286387e1aSJeff Kirsher #define TXD_GATHER_CODE_LAST    s2BIT(23)
50386387e1aSJeff Kirsher #define TXD_TCP_LSO_EN          s2BIT(30)
50486387e1aSJeff Kirsher #define TXD_UDP_COF_EN          s2BIT(31)
50586387e1aSJeff Kirsher #define TXD_UFO_EN		s2BIT(31) | s2BIT(30)
50686387e1aSJeff Kirsher #define TXD_TCP_LSO_MSS(val)    vBIT(val,34,14)
50786387e1aSJeff Kirsher #define TXD_UFO_MSS(val)	vBIT(val,34,14)
50886387e1aSJeff Kirsher #define TXD_BUFFER0_SIZE(val)   vBIT(val,48,16)
50986387e1aSJeff Kirsher 
51086387e1aSJeff Kirsher 	u64 Control_2;
51186387e1aSJeff Kirsher #define TXD_TX_CKO_CONTROL      (s2BIT(5)|s2BIT(6)|s2BIT(7))
51286387e1aSJeff Kirsher #define TXD_TX_CKO_IPV4_EN      s2BIT(5)
51386387e1aSJeff Kirsher #define TXD_TX_CKO_TCP_EN       s2BIT(6)
51486387e1aSJeff Kirsher #define TXD_TX_CKO_UDP_EN       s2BIT(7)
51586387e1aSJeff Kirsher #define TXD_VLAN_ENABLE         s2BIT(15)
51686387e1aSJeff Kirsher #define TXD_VLAN_TAG(val)       vBIT(val,16,16)
51786387e1aSJeff Kirsher #define TXD_INT_NUMBER(val)     vBIT(val,34,6)
51886387e1aSJeff Kirsher #define TXD_INT_TYPE_PER_LIST   s2BIT(47)
51986387e1aSJeff Kirsher #define TXD_INT_TYPE_UTILZ      s2BIT(46)
52086387e1aSJeff Kirsher #define TXD_SET_MARKER         vBIT(0x6,0,4)
52186387e1aSJeff Kirsher 
52286387e1aSJeff Kirsher 	u64 Buffer_Pointer;
52386387e1aSJeff Kirsher 	u64 Host_Control;	/* reserved for host */
52486387e1aSJeff Kirsher };
52586387e1aSJeff Kirsher 
52686387e1aSJeff Kirsher /* Structure to hold the phy and virt addr of every TxDL. */
52786387e1aSJeff Kirsher struct list_info_hold {
52886387e1aSJeff Kirsher 	dma_addr_t list_phy_addr;
52986387e1aSJeff Kirsher 	void *list_virt_addr;
53086387e1aSJeff Kirsher };
53186387e1aSJeff Kirsher 
53286387e1aSJeff Kirsher /* Rx descriptor structure for 1 buffer mode */
53386387e1aSJeff Kirsher struct RxD_t {
53486387e1aSJeff Kirsher 	u64 Host_Control;	/* reserved for host */
53586387e1aSJeff Kirsher 	u64 Control_1;
53686387e1aSJeff Kirsher #define RXD_OWN_XENA            s2BIT(7)
53786387e1aSJeff Kirsher #define RXD_T_CODE              (s2BIT(12)|s2BIT(13)|s2BIT(14)|s2BIT(15))
53886387e1aSJeff Kirsher #define RXD_FRAME_PROTO         vBIT(0xFFFF,24,8)
53986387e1aSJeff Kirsher #define RXD_FRAME_VLAN_TAG      s2BIT(24)
54086387e1aSJeff Kirsher #define RXD_FRAME_PROTO_IPV4    s2BIT(27)
54186387e1aSJeff Kirsher #define RXD_FRAME_PROTO_IPV6    s2BIT(28)
54286387e1aSJeff Kirsher #define RXD_FRAME_IP_FRAG	s2BIT(29)
54386387e1aSJeff Kirsher #define RXD_FRAME_PROTO_TCP     s2BIT(30)
54486387e1aSJeff Kirsher #define RXD_FRAME_PROTO_UDP     s2BIT(31)
54586387e1aSJeff Kirsher #define TCP_OR_UDP_FRAME        (RXD_FRAME_PROTO_TCP | RXD_FRAME_PROTO_UDP)
54686387e1aSJeff Kirsher #define RXD_GET_L3_CKSUM(val)   ((u16)(val>> 16) & 0xFFFF)
54786387e1aSJeff Kirsher #define RXD_GET_L4_CKSUM(val)   ((u16)(val) & 0xFFFF)
54886387e1aSJeff Kirsher 
54986387e1aSJeff Kirsher 	u64 Control_2;
55086387e1aSJeff Kirsher #define	THE_RXD_MARK		0x3
55186387e1aSJeff Kirsher #define	SET_RXD_MARKER		vBIT(THE_RXD_MARK, 0, 2)
55286387e1aSJeff Kirsher #define	GET_RXD_MARKER(ctrl)	((ctrl & SET_RXD_MARKER) >> 62)
55386387e1aSJeff Kirsher 
55486387e1aSJeff Kirsher #define MASK_VLAN_TAG           vBIT(0xFFFF,48,16)
55586387e1aSJeff Kirsher #define SET_VLAN_TAG(val)       vBIT(val,48,16)
55686387e1aSJeff Kirsher #define SET_NUM_TAG(val)       vBIT(val,16,32)
55786387e1aSJeff Kirsher 
55886387e1aSJeff Kirsher 
55986387e1aSJeff Kirsher };
56086387e1aSJeff Kirsher /* Rx descriptor structure for 1 buffer mode */
56186387e1aSJeff Kirsher struct RxD1 {
56286387e1aSJeff Kirsher 	struct RxD_t h;
56386387e1aSJeff Kirsher 
56486387e1aSJeff Kirsher #define MASK_BUFFER0_SIZE_1       vBIT(0x3FFF,2,14)
56586387e1aSJeff Kirsher #define SET_BUFFER0_SIZE_1(val)   vBIT(val,2,14)
56686387e1aSJeff Kirsher #define RXD_GET_BUFFER0_SIZE_1(_Control_2) \
56786387e1aSJeff Kirsher 	(u16)((_Control_2 & MASK_BUFFER0_SIZE_1) >> 48)
56886387e1aSJeff Kirsher 	u64 Buffer0_ptr;
56986387e1aSJeff Kirsher };
57086387e1aSJeff Kirsher /* Rx descriptor structure for 3 or 2 buffer mode */
57186387e1aSJeff Kirsher 
57286387e1aSJeff Kirsher struct RxD3 {
57386387e1aSJeff Kirsher 	struct RxD_t h;
57486387e1aSJeff Kirsher 
57586387e1aSJeff Kirsher #define MASK_BUFFER0_SIZE_3       vBIT(0xFF,2,14)
57686387e1aSJeff Kirsher #define MASK_BUFFER1_SIZE_3       vBIT(0xFFFF,16,16)
57786387e1aSJeff Kirsher #define MASK_BUFFER2_SIZE_3       vBIT(0xFFFF,32,16)
57886387e1aSJeff Kirsher #define SET_BUFFER0_SIZE_3(val)   vBIT(val,8,8)
57986387e1aSJeff Kirsher #define SET_BUFFER1_SIZE_3(val)   vBIT(val,16,16)
58086387e1aSJeff Kirsher #define SET_BUFFER2_SIZE_3(val)   vBIT(val,32,16)
58186387e1aSJeff Kirsher #define RXD_GET_BUFFER0_SIZE_3(Control_2) \
58286387e1aSJeff Kirsher 	(u8)((Control_2 & MASK_BUFFER0_SIZE_3) >> 48)
58386387e1aSJeff Kirsher #define RXD_GET_BUFFER1_SIZE_3(Control_2) \
58486387e1aSJeff Kirsher 	(u16)((Control_2 & MASK_BUFFER1_SIZE_3) >> 32)
58586387e1aSJeff Kirsher #define RXD_GET_BUFFER2_SIZE_3(Control_2) \
58686387e1aSJeff Kirsher 	(u16)((Control_2 & MASK_BUFFER2_SIZE_3) >> 16)
58786387e1aSJeff Kirsher #define BUF0_LEN	40
58886387e1aSJeff Kirsher #define BUF1_LEN	1
58986387e1aSJeff Kirsher 
59086387e1aSJeff Kirsher 	u64 Buffer0_ptr;
59186387e1aSJeff Kirsher 	u64 Buffer1_ptr;
59286387e1aSJeff Kirsher 	u64 Buffer2_ptr;
59386387e1aSJeff Kirsher };
59486387e1aSJeff Kirsher 
59586387e1aSJeff Kirsher 
59686387e1aSJeff Kirsher /* Structure that represents the Rx descriptor block which contains
59786387e1aSJeff Kirsher  * 128 Rx descriptors.
59886387e1aSJeff Kirsher  */
59986387e1aSJeff Kirsher struct RxD_block {
60086387e1aSJeff Kirsher #define MAX_RXDS_PER_BLOCK_1            127
60186387e1aSJeff Kirsher 	struct RxD1 rxd[MAX_RXDS_PER_BLOCK_1];
60286387e1aSJeff Kirsher 
60386387e1aSJeff Kirsher 	u64 reserved_0;
60486387e1aSJeff Kirsher #define END_OF_BLOCK    0xFEFFFFFFFFFFFFFFULL
60586387e1aSJeff Kirsher 	u64 reserved_1;		/* 0xFEFFFFFFFFFFFFFF to mark last
60686387e1aSJeff Kirsher 				 * Rxd in this blk */
60786387e1aSJeff Kirsher 	u64 reserved_2_pNext_RxD_block;	/* Logical ptr to next */
60886387e1aSJeff Kirsher 	u64 pNext_RxD_Blk_physical;	/* Buff0_ptr.In a 32 bit arch
60986387e1aSJeff Kirsher 					 * the upper 32 bits should
61086387e1aSJeff Kirsher 					 * be 0 */
61186387e1aSJeff Kirsher };
61286387e1aSJeff Kirsher 
61386387e1aSJeff Kirsher #define SIZE_OF_BLOCK	4096
61486387e1aSJeff Kirsher 
61586387e1aSJeff Kirsher #define RXD_MODE_1	0 /* One Buffer mode */
61686387e1aSJeff Kirsher #define RXD_MODE_3B	1 /* Two Buffer mode */
61786387e1aSJeff Kirsher 
61886387e1aSJeff Kirsher /* Structure to hold virtual addresses of Buf0 and Buf1 in
61986387e1aSJeff Kirsher  * 2buf mode. */
62086387e1aSJeff Kirsher struct buffAdd {
62186387e1aSJeff Kirsher 	void *ba_0_org;
62286387e1aSJeff Kirsher 	void *ba_1_org;
62386387e1aSJeff Kirsher 	void *ba_0;
62486387e1aSJeff Kirsher 	void *ba_1;
62586387e1aSJeff Kirsher };
62686387e1aSJeff Kirsher 
62786387e1aSJeff Kirsher /* Structure which stores all the MAC control parameters */
62886387e1aSJeff Kirsher 
62986387e1aSJeff Kirsher /* This structure stores the offset of the RxD in the ring
63086387e1aSJeff Kirsher  * from which the Rx Interrupt processor can start picking
63186387e1aSJeff Kirsher  * up the RxDs for processing.
63286387e1aSJeff Kirsher  */
63386387e1aSJeff Kirsher struct rx_curr_get_info {
63486387e1aSJeff Kirsher 	u32 block_index;
63586387e1aSJeff Kirsher 	u32 offset;
63686387e1aSJeff Kirsher 	u32 ring_len;
63786387e1aSJeff Kirsher };
63886387e1aSJeff Kirsher 
63986387e1aSJeff Kirsher struct rx_curr_put_info {
64086387e1aSJeff Kirsher 	u32 block_index;
64186387e1aSJeff Kirsher 	u32 offset;
64286387e1aSJeff Kirsher 	u32 ring_len;
64386387e1aSJeff Kirsher };
64486387e1aSJeff Kirsher 
64586387e1aSJeff Kirsher /* This structure stores the offset of the TxDl in the FIFO
64686387e1aSJeff Kirsher  * from which the Tx Interrupt processor can start picking
64786387e1aSJeff Kirsher  * up the TxDLs for send complete interrupt processing.
64886387e1aSJeff Kirsher  */
64986387e1aSJeff Kirsher struct tx_curr_get_info {
65086387e1aSJeff Kirsher 	u32 offset;
65186387e1aSJeff Kirsher 	u32 fifo_len;
65286387e1aSJeff Kirsher };
65386387e1aSJeff Kirsher 
65486387e1aSJeff Kirsher struct tx_curr_put_info {
65586387e1aSJeff Kirsher 	u32 offset;
65686387e1aSJeff Kirsher 	u32 fifo_len;
65786387e1aSJeff Kirsher };
65886387e1aSJeff Kirsher 
65986387e1aSJeff Kirsher struct rxd_info {
66086387e1aSJeff Kirsher 	void *virt_addr;
66186387e1aSJeff Kirsher 	dma_addr_t dma_addr;
66286387e1aSJeff Kirsher };
66386387e1aSJeff Kirsher 
66486387e1aSJeff Kirsher /* Structure that holds the Phy and virt addresses of the Blocks */
66586387e1aSJeff Kirsher struct rx_block_info {
66686387e1aSJeff Kirsher 	void *block_virt_addr;
66786387e1aSJeff Kirsher 	dma_addr_t block_dma_addr;
66886387e1aSJeff Kirsher 	struct rxd_info *rxds;
66986387e1aSJeff Kirsher };
67086387e1aSJeff Kirsher 
67186387e1aSJeff Kirsher /* Data structure to represent a LRO session */
67286387e1aSJeff Kirsher struct lro {
67386387e1aSJeff Kirsher 	struct sk_buff	*parent;
67486387e1aSJeff Kirsher 	struct sk_buff  *last_frag;
67586387e1aSJeff Kirsher 	u8		*l2h;
67686387e1aSJeff Kirsher 	struct iphdr	*iph;
67786387e1aSJeff Kirsher 	struct tcphdr	*tcph;
67886387e1aSJeff Kirsher 	u32		tcp_next_seq;
67986387e1aSJeff Kirsher 	__be32		tcp_ack;
68086387e1aSJeff Kirsher 	int		total_len;
68186387e1aSJeff Kirsher 	int		frags_len;
68286387e1aSJeff Kirsher 	int		sg_num;
68386387e1aSJeff Kirsher 	int		in_use;
68486387e1aSJeff Kirsher 	__be16		window;
68586387e1aSJeff Kirsher 	u16             vlan_tag;
68686387e1aSJeff Kirsher 	u32		cur_tsval;
68786387e1aSJeff Kirsher 	__be32		cur_tsecr;
68886387e1aSJeff Kirsher 	u8		saw_ts;
68986387e1aSJeff Kirsher } ____cacheline_aligned;
69086387e1aSJeff Kirsher 
69186387e1aSJeff Kirsher /* Ring specific structure */
69286387e1aSJeff Kirsher struct ring_info {
69386387e1aSJeff Kirsher 	/* The ring number */
69486387e1aSJeff Kirsher 	int ring_no;
69586387e1aSJeff Kirsher 
69686387e1aSJeff Kirsher 	/* per-ring buffer counter */
69786387e1aSJeff Kirsher 	u32 rx_bufs_left;
69886387e1aSJeff Kirsher 
69986387e1aSJeff Kirsher #define MAX_LRO_SESSIONS       32
70086387e1aSJeff Kirsher 	struct lro lro0_n[MAX_LRO_SESSIONS];
70186387e1aSJeff Kirsher 	u8		lro;
70286387e1aSJeff Kirsher 
70386387e1aSJeff Kirsher 	/* copy of sp->rxd_mode flag */
70486387e1aSJeff Kirsher 	int rxd_mode;
70586387e1aSJeff Kirsher 
70686387e1aSJeff Kirsher 	/* Number of rxds per block for the rxd_mode */
70786387e1aSJeff Kirsher 	int rxd_count;
70886387e1aSJeff Kirsher 
70986387e1aSJeff Kirsher 	/* copy of sp pointer */
71086387e1aSJeff Kirsher 	struct s2io_nic *nic;
71186387e1aSJeff Kirsher 
71286387e1aSJeff Kirsher 	/* copy of sp->dev pointer */
71386387e1aSJeff Kirsher 	struct net_device *dev;
71486387e1aSJeff Kirsher 
71586387e1aSJeff Kirsher 	/* copy of sp->pdev pointer */
71686387e1aSJeff Kirsher 	struct pci_dev *pdev;
71786387e1aSJeff Kirsher 
71886387e1aSJeff Kirsher 	/* Per ring napi struct */
71986387e1aSJeff Kirsher 	struct napi_struct napi;
72086387e1aSJeff Kirsher 
72186387e1aSJeff Kirsher 	unsigned long interrupt_count;
72286387e1aSJeff Kirsher 
72386387e1aSJeff Kirsher 	/*
72486387e1aSJeff Kirsher 	 *  Place holders for the virtual and physical addresses of
72586387e1aSJeff Kirsher 	 *  all the Rx Blocks
72686387e1aSJeff Kirsher 	 */
72786387e1aSJeff Kirsher 	struct rx_block_info rx_blocks[MAX_RX_BLOCKS_PER_RING];
72886387e1aSJeff Kirsher 	int block_count;
72986387e1aSJeff Kirsher 	int pkt_cnt;
73086387e1aSJeff Kirsher 
73186387e1aSJeff Kirsher 	/*
73286387e1aSJeff Kirsher 	 * Put pointer info which indictes which RxD has to be replenished
73386387e1aSJeff Kirsher 	 * with a new buffer.
73486387e1aSJeff Kirsher 	 */
73586387e1aSJeff Kirsher 	struct rx_curr_put_info rx_curr_put_info;
73686387e1aSJeff Kirsher 
73786387e1aSJeff Kirsher 	/*
73886387e1aSJeff Kirsher 	 * Get pointer info which indictes which is the last RxD that was
73986387e1aSJeff Kirsher 	 * processed by the driver.
74086387e1aSJeff Kirsher 	 */
74186387e1aSJeff Kirsher 	struct rx_curr_get_info rx_curr_get_info;
74286387e1aSJeff Kirsher 
74386387e1aSJeff Kirsher 	/* interface MTU value */
74486387e1aSJeff Kirsher         unsigned mtu;
74586387e1aSJeff Kirsher 
74686387e1aSJeff Kirsher 	/* Buffer Address store. */
74786387e1aSJeff Kirsher 	struct buffAdd **ba;
74886387e1aSJeff Kirsher } ____cacheline_aligned;
74986387e1aSJeff Kirsher 
75086387e1aSJeff Kirsher /* Fifo specific structure */
75186387e1aSJeff Kirsher struct fifo_info {
75286387e1aSJeff Kirsher 	/* FIFO number */
75386387e1aSJeff Kirsher 	int fifo_no;
75486387e1aSJeff Kirsher 
75586387e1aSJeff Kirsher 	/* Maximum TxDs per TxDL */
75686387e1aSJeff Kirsher 	int max_txds;
75786387e1aSJeff Kirsher 
75886387e1aSJeff Kirsher 	/* Place holder of all the TX List's Phy and Virt addresses. */
75986387e1aSJeff Kirsher 	struct list_info_hold *list_info;
76086387e1aSJeff Kirsher 
76186387e1aSJeff Kirsher 	/*
76286387e1aSJeff Kirsher 	 * Current offset within the tx FIFO where driver would write
76386387e1aSJeff Kirsher 	 * new Tx frame
76486387e1aSJeff Kirsher 	 */
76586387e1aSJeff Kirsher 	struct tx_curr_put_info tx_curr_put_info;
76686387e1aSJeff Kirsher 
76786387e1aSJeff Kirsher 	/*
76886387e1aSJeff Kirsher 	 * Current offset within tx FIFO from where the driver would start freeing
76986387e1aSJeff Kirsher 	 * the buffers
77086387e1aSJeff Kirsher 	 */
77186387e1aSJeff Kirsher 	struct tx_curr_get_info tx_curr_get_info;
77286387e1aSJeff Kirsher #define FIFO_QUEUE_START 0
77386387e1aSJeff Kirsher #define FIFO_QUEUE_STOP 1
77486387e1aSJeff Kirsher 	int queue_state;
77586387e1aSJeff Kirsher 
77686387e1aSJeff Kirsher 	/* copy of sp->dev pointer */
77786387e1aSJeff Kirsher 	struct net_device *dev;
77886387e1aSJeff Kirsher 
77986387e1aSJeff Kirsher 	/* copy of multiq status */
78086387e1aSJeff Kirsher 	u8 multiq;
78186387e1aSJeff Kirsher 
78286387e1aSJeff Kirsher 	/* Per fifo lock */
78386387e1aSJeff Kirsher 	spinlock_t tx_lock;
78486387e1aSJeff Kirsher 
78586387e1aSJeff Kirsher 	/* Per fifo UFO in band structure */
78686387e1aSJeff Kirsher 	u64 *ufo_in_band_v;
78786387e1aSJeff Kirsher 
78886387e1aSJeff Kirsher 	struct s2io_nic *nic;
78986387e1aSJeff Kirsher } ____cacheline_aligned;
79086387e1aSJeff Kirsher 
79186387e1aSJeff Kirsher /* Information related to the Tx and Rx FIFOs and Rings of Xena
79286387e1aSJeff Kirsher  * is maintained in this structure.
79386387e1aSJeff Kirsher  */
79486387e1aSJeff Kirsher struct mac_info {
79586387e1aSJeff Kirsher /* tx side stuff */
79686387e1aSJeff Kirsher 	/* logical pointer of start of each Tx FIFO */
79786387e1aSJeff Kirsher 	struct TxFIFO_element __iomem *tx_FIFO_start[MAX_TX_FIFOS];
79886387e1aSJeff Kirsher 
79986387e1aSJeff Kirsher 	/* Fifo specific structure */
80086387e1aSJeff Kirsher 	struct fifo_info fifos[MAX_TX_FIFOS];
80186387e1aSJeff Kirsher 
80286387e1aSJeff Kirsher 	/* Save virtual address of TxD page with zero DMA addr(if any) */
80386387e1aSJeff Kirsher 	void *zerodma_virt_addr;
80486387e1aSJeff Kirsher 
80586387e1aSJeff Kirsher /* rx side stuff */
80686387e1aSJeff Kirsher 	/* Ring specific structure */
80786387e1aSJeff Kirsher 	struct ring_info rings[MAX_RX_RINGS];
80886387e1aSJeff Kirsher 
80986387e1aSJeff Kirsher 	u16 rmac_pause_time;
81086387e1aSJeff Kirsher 	u16 mc_pause_threshold_q0q3;
81186387e1aSJeff Kirsher 	u16 mc_pause_threshold_q4q7;
81286387e1aSJeff Kirsher 
81386387e1aSJeff Kirsher 	void *stats_mem;	/* orignal pointer to allocated mem */
81486387e1aSJeff Kirsher 	dma_addr_t stats_mem_phy;	/* Physical address of the stat block */
81586387e1aSJeff Kirsher 	u32 stats_mem_sz;
81686387e1aSJeff Kirsher 	struct stat_block *stats_info;	/* Logical address of the stat block */
81786387e1aSJeff Kirsher };
81886387e1aSJeff Kirsher 
81986387e1aSJeff Kirsher /* Default Tunable parameters of the NIC. */
82086387e1aSJeff Kirsher #define DEFAULT_FIFO_0_LEN 4096
82186387e1aSJeff Kirsher #define DEFAULT_FIFO_1_7_LEN 512
82286387e1aSJeff Kirsher #define SMALL_BLK_CNT	30
82386387e1aSJeff Kirsher #define LARGE_BLK_CNT	100
82486387e1aSJeff Kirsher 
82586387e1aSJeff Kirsher /*
82686387e1aSJeff Kirsher  * Structure to keep track of the MSI-X vectors and the corresponding
82786387e1aSJeff Kirsher  * argument registered against each vector
82886387e1aSJeff Kirsher  */
82986387e1aSJeff Kirsher #define MAX_REQUESTED_MSI_X	9
83086387e1aSJeff Kirsher struct s2io_msix_entry
83186387e1aSJeff Kirsher {
83286387e1aSJeff Kirsher 	u16 vector;
83386387e1aSJeff Kirsher 	u16 entry;
83486387e1aSJeff Kirsher 	void *arg;
83586387e1aSJeff Kirsher 
83686387e1aSJeff Kirsher 	u8 type;
83786387e1aSJeff Kirsher #define        MSIX_ALARM_TYPE         1
83886387e1aSJeff Kirsher #define        MSIX_RING_TYPE          2
83986387e1aSJeff Kirsher 
84086387e1aSJeff Kirsher 	u8 in_use;
84186387e1aSJeff Kirsher #define MSIX_REGISTERED_SUCCESS	0xAA
84286387e1aSJeff Kirsher };
84386387e1aSJeff Kirsher 
84486387e1aSJeff Kirsher struct msix_info_st {
84586387e1aSJeff Kirsher 	u64 addr;
84686387e1aSJeff Kirsher 	u64 data;
84786387e1aSJeff Kirsher };
84886387e1aSJeff Kirsher 
84986387e1aSJeff Kirsher /* These flags represent the devices temporary state */
85086387e1aSJeff Kirsher enum s2io_device_state_t
85186387e1aSJeff Kirsher {
85286387e1aSJeff Kirsher 	__S2IO_STATE_LINK_TASK=0,
85386387e1aSJeff Kirsher 	__S2IO_STATE_CARD_UP
85486387e1aSJeff Kirsher };
85586387e1aSJeff Kirsher 
85686387e1aSJeff Kirsher /* Structure representing one instance of the NIC */
85786387e1aSJeff Kirsher struct s2io_nic {
85886387e1aSJeff Kirsher 	int rxd_mode;
85986387e1aSJeff Kirsher 	/*
86086387e1aSJeff Kirsher 	 * Count of packets to be processed in a given iteration, it will be indicated
86186387e1aSJeff Kirsher 	 * by the quota field of the device structure when NAPI is enabled.
86286387e1aSJeff Kirsher 	 */
86386387e1aSJeff Kirsher 	int pkts_to_process;
86486387e1aSJeff Kirsher 	struct net_device *dev;
86586387e1aSJeff Kirsher 	struct mac_info mac_control;
86686387e1aSJeff Kirsher 	struct config_param config;
86786387e1aSJeff Kirsher 	struct pci_dev *pdev;
86886387e1aSJeff Kirsher 	void __iomem *bar0;
86986387e1aSJeff Kirsher 	void __iomem *bar1;
87086387e1aSJeff Kirsher #define MAX_MAC_SUPPORTED   16
87186387e1aSJeff Kirsher #define MAX_SUPPORTED_MULTICASTS MAX_MAC_SUPPORTED
87286387e1aSJeff Kirsher 
87386387e1aSJeff Kirsher 	struct mac_addr def_mac_addr[256];
87486387e1aSJeff Kirsher 
87586387e1aSJeff Kirsher 	struct net_device_stats stats;
87686387e1aSJeff Kirsher 	int device_enabled_once;
87786387e1aSJeff Kirsher 
87886387e1aSJeff Kirsher 	char name[60];
87986387e1aSJeff Kirsher 
88086387e1aSJeff Kirsher 	/* Timer that handles I/O errors/exceptions */
88186387e1aSJeff Kirsher 	struct timer_list alarm_timer;
88286387e1aSJeff Kirsher 
88386387e1aSJeff Kirsher 	/* Space to back up the PCI config space */
88486387e1aSJeff Kirsher 	u32 config_space[256 / sizeof(u32)];
88586387e1aSJeff Kirsher 
88686387e1aSJeff Kirsher #define PROMISC     1
88786387e1aSJeff Kirsher #define ALL_MULTI   2
88886387e1aSJeff Kirsher 
88986387e1aSJeff Kirsher #define MAX_ADDRS_SUPPORTED 64
89086387e1aSJeff Kirsher 	u16 mc_addr_count;
89186387e1aSJeff Kirsher 
89286387e1aSJeff Kirsher 	u16 m_cast_flg;
89386387e1aSJeff Kirsher 	u16 all_multi_pos;
89486387e1aSJeff Kirsher 	u16 promisc_flg;
89586387e1aSJeff Kirsher 
89686387e1aSJeff Kirsher 	/*  Restart timer, used to restart NIC if the device is stuck and
89786387e1aSJeff Kirsher 	 *  a schedule task that will set the correct Link state once the
89886387e1aSJeff Kirsher 	 *  NIC's PHY has stabilized after a state change.
89986387e1aSJeff Kirsher 	 */
90086387e1aSJeff Kirsher 	struct work_struct rst_timer_task;
90186387e1aSJeff Kirsher 	struct work_struct set_link_task;
90286387e1aSJeff Kirsher 
90386387e1aSJeff Kirsher 	/* Flag that can be used to turn on or turn off the Rx checksum
90486387e1aSJeff Kirsher 	 * offload feature.
90586387e1aSJeff Kirsher 	 */
90686387e1aSJeff Kirsher 	int rx_csum;
90786387e1aSJeff Kirsher 
90886387e1aSJeff Kirsher 	/* Below variables are used for fifo selection to transmit a packet */
90986387e1aSJeff Kirsher 	u16 fifo_selector[MAX_TX_FIFOS];
91086387e1aSJeff Kirsher 
91186387e1aSJeff Kirsher 	/* Total fifos for tcp packets */
91286387e1aSJeff Kirsher 	u8 total_tcp_fifos;
91386387e1aSJeff Kirsher 
91486387e1aSJeff Kirsher 	/*
91586387e1aSJeff Kirsher 	* Beginning index of udp for udp packets
91686387e1aSJeff Kirsher 	* Value will be equal to
91786387e1aSJeff Kirsher 	* (tx_fifo_num - FIFO_UDP_MAX_NUM - FIFO_OTHER_MAX_NUM)
91886387e1aSJeff Kirsher 	*/
91986387e1aSJeff Kirsher 	u8 udp_fifo_idx;
92086387e1aSJeff Kirsher 
92186387e1aSJeff Kirsher 	u8 total_udp_fifos;
92286387e1aSJeff Kirsher 
92386387e1aSJeff Kirsher 	/*
92486387e1aSJeff Kirsher 	 * Beginning index of fifo for all other packets
92586387e1aSJeff Kirsher 	 * Value will be equal to (tx_fifo_num - FIFO_OTHER_MAX_NUM)
92686387e1aSJeff Kirsher 	*/
92786387e1aSJeff Kirsher 	u8 other_fifo_idx;
92886387e1aSJeff Kirsher 
92986387e1aSJeff Kirsher 	struct napi_struct napi;
93086387e1aSJeff Kirsher 	/*  after blink, the adapter must be restored with original
93186387e1aSJeff Kirsher 	 *  values.
93286387e1aSJeff Kirsher 	 */
93386387e1aSJeff Kirsher 	u64 adapt_ctrl_org;
93486387e1aSJeff Kirsher 
93586387e1aSJeff Kirsher 	/* Last known link state. */
93686387e1aSJeff Kirsher 	u16 last_link_state;
93786387e1aSJeff Kirsher #define	LINK_DOWN	1
93886387e1aSJeff Kirsher #define	LINK_UP		2
93986387e1aSJeff Kirsher 
94086387e1aSJeff Kirsher 	int task_flag;
94186387e1aSJeff Kirsher 	unsigned long long start_time;
94286387e1aSJeff Kirsher 	int vlan_strip_flag;
94386387e1aSJeff Kirsher #define MSIX_FLG                0xA5
94486387e1aSJeff Kirsher 	int num_entries;
94586387e1aSJeff Kirsher 	struct msix_entry *entries;
94686387e1aSJeff Kirsher 	int msi_detected;
94786387e1aSJeff Kirsher 	wait_queue_head_t msi_wait;
94886387e1aSJeff Kirsher 	struct s2io_msix_entry *s2io_entries;
94986387e1aSJeff Kirsher 	char desc[MAX_REQUESTED_MSI_X][25];
95086387e1aSJeff Kirsher 
95186387e1aSJeff Kirsher 	int avail_msix_vectors; /* No. of MSI-X vectors granted by system */
95286387e1aSJeff Kirsher 
95386387e1aSJeff Kirsher 	struct msix_info_st msix_info[0x3f];
95486387e1aSJeff Kirsher 
95586387e1aSJeff Kirsher #define XFRAME_I_DEVICE		1
95686387e1aSJeff Kirsher #define XFRAME_II_DEVICE	2
95786387e1aSJeff Kirsher 	u8 device_type;
95886387e1aSJeff Kirsher 
95986387e1aSJeff Kirsher 	unsigned long	clubbed_frms_cnt;
96086387e1aSJeff Kirsher 	unsigned long	sending_both;
96186387e1aSJeff Kirsher 	u16		lro_max_aggr_per_sess;
96286387e1aSJeff Kirsher 	volatile unsigned long state;
96386387e1aSJeff Kirsher 	u64		general_int_mask;
96486387e1aSJeff Kirsher 
96586387e1aSJeff Kirsher #define VPD_STRING_LEN 80
96686387e1aSJeff Kirsher 	u8  product_name[VPD_STRING_LEN];
96786387e1aSJeff Kirsher 	u8  serial_num[VPD_STRING_LEN];
96886387e1aSJeff Kirsher };
96986387e1aSJeff Kirsher 
97086387e1aSJeff Kirsher #define RESET_ERROR 1
97186387e1aSJeff Kirsher #define CMD_ERROR   2
97286387e1aSJeff Kirsher 
97386387e1aSJeff Kirsher /*
97486387e1aSJeff Kirsher  * Some registers have to be written in a particular order to
97586387e1aSJeff Kirsher  * expect correct hardware operation. The macro SPECIAL_REG_WRITE
97686387e1aSJeff Kirsher  * is used to perform such ordered writes. Defines UF (Upper First)
97786387e1aSJeff Kirsher  * and LF (Lower First) will be used to specify the required write order.
97886387e1aSJeff Kirsher  */
97986387e1aSJeff Kirsher #define UF	1
98086387e1aSJeff Kirsher #define LF	2
SPECIAL_REG_WRITE(u64 val,void __iomem * addr,int order)98186387e1aSJeff Kirsher static inline void SPECIAL_REG_WRITE(u64 val, void __iomem *addr, int order)
98286387e1aSJeff Kirsher {
98386387e1aSJeff Kirsher 	if (order == LF) {
98486387e1aSJeff Kirsher 		writel((u32) (val), addr);
98586387e1aSJeff Kirsher 		(void) readl(addr);
98686387e1aSJeff Kirsher 		writel((u32) (val >> 32), (addr + 4));
98786387e1aSJeff Kirsher 		(void) readl(addr + 4);
98886387e1aSJeff Kirsher 	} else {
98986387e1aSJeff Kirsher 		writel((u32) (val >> 32), (addr + 4));
99086387e1aSJeff Kirsher 		(void) readl(addr + 4);
99186387e1aSJeff Kirsher 		writel((u32) (val), addr);
99286387e1aSJeff Kirsher 		(void) readl(addr);
99386387e1aSJeff Kirsher 	}
99486387e1aSJeff Kirsher }
99586387e1aSJeff Kirsher 
99686387e1aSJeff Kirsher /*  Interrupt related values of Xena */
99786387e1aSJeff Kirsher 
99886387e1aSJeff Kirsher #define ENABLE_INTRS    1
99986387e1aSJeff Kirsher #define DISABLE_INTRS   2
100086387e1aSJeff Kirsher 
100186387e1aSJeff Kirsher /*  Highest level interrupt blocks */
100286387e1aSJeff Kirsher #define TX_PIC_INTR     (0x0001<<0)
100386387e1aSJeff Kirsher #define TX_DMA_INTR     (0x0001<<1)
100486387e1aSJeff Kirsher #define TX_MAC_INTR     (0x0001<<2)
100586387e1aSJeff Kirsher #define TX_XGXS_INTR    (0x0001<<3)
100686387e1aSJeff Kirsher #define TX_TRAFFIC_INTR (0x0001<<4)
100786387e1aSJeff Kirsher #define RX_PIC_INTR     (0x0001<<5)
100886387e1aSJeff Kirsher #define RX_DMA_INTR     (0x0001<<6)
100986387e1aSJeff Kirsher #define RX_MAC_INTR     (0x0001<<7)
101086387e1aSJeff Kirsher #define RX_XGXS_INTR    (0x0001<<8)
101186387e1aSJeff Kirsher #define RX_TRAFFIC_INTR (0x0001<<9)
101286387e1aSJeff Kirsher #define MC_INTR         (0x0001<<10)
101386387e1aSJeff Kirsher #define ENA_ALL_INTRS    (   TX_PIC_INTR     | \
101486387e1aSJeff Kirsher                             TX_DMA_INTR     | \
101586387e1aSJeff Kirsher                             TX_MAC_INTR     | \
101686387e1aSJeff Kirsher                             TX_XGXS_INTR    | \
101786387e1aSJeff Kirsher                             TX_TRAFFIC_INTR | \
101886387e1aSJeff Kirsher                             RX_PIC_INTR     | \
101986387e1aSJeff Kirsher                             RX_DMA_INTR     | \
102086387e1aSJeff Kirsher                             RX_MAC_INTR     | \
102186387e1aSJeff Kirsher                             RX_XGXS_INTR    | \
102286387e1aSJeff Kirsher                             RX_TRAFFIC_INTR | \
102386387e1aSJeff Kirsher                             MC_INTR )
102486387e1aSJeff Kirsher 
102586387e1aSJeff Kirsher /*  Interrupt masks for the general interrupt mask register */
102686387e1aSJeff Kirsher #define DISABLE_ALL_INTRS   0xFFFFFFFFFFFFFFFFULL
102786387e1aSJeff Kirsher 
102886387e1aSJeff Kirsher #define TXPIC_INT_M         s2BIT(0)
102986387e1aSJeff Kirsher #define TXDMA_INT_M         s2BIT(1)
103086387e1aSJeff Kirsher #define TXMAC_INT_M         s2BIT(2)
103186387e1aSJeff Kirsher #define TXXGXS_INT_M        s2BIT(3)
103286387e1aSJeff Kirsher #define TXTRAFFIC_INT_M     s2BIT(8)
103386387e1aSJeff Kirsher #define PIC_RX_INT_M        s2BIT(32)
103486387e1aSJeff Kirsher #define RXDMA_INT_M         s2BIT(33)
103586387e1aSJeff Kirsher #define RXMAC_INT_M         s2BIT(34)
103686387e1aSJeff Kirsher #define MC_INT_M            s2BIT(35)
103786387e1aSJeff Kirsher #define RXXGXS_INT_M        s2BIT(36)
103886387e1aSJeff Kirsher #define RXTRAFFIC_INT_M     s2BIT(40)
103986387e1aSJeff Kirsher 
104086387e1aSJeff Kirsher /*  PIC level Interrupts TODO*/
104186387e1aSJeff Kirsher 
104286387e1aSJeff Kirsher /*  DMA level Inressupts */
104386387e1aSJeff Kirsher #define TXDMA_PFC_INT_M     s2BIT(0)
104486387e1aSJeff Kirsher #define TXDMA_PCC_INT_M     s2BIT(2)
104586387e1aSJeff Kirsher 
104686387e1aSJeff Kirsher /*  PFC block interrupts */
104786387e1aSJeff Kirsher #define PFC_MISC_ERR_1      s2BIT(0)	/* Interrupt to indicate FIFO full */
104886387e1aSJeff Kirsher 
104986387e1aSJeff Kirsher /* PCC block interrupts. */
105086387e1aSJeff Kirsher #define	PCC_FB_ECC_ERR	   vBIT(0xff, 16, 8)	/* Interrupt to indicate
105186387e1aSJeff Kirsher 						   PCC_FB_ECC Error. */
105286387e1aSJeff Kirsher 
105386387e1aSJeff Kirsher #define RXD_GET_VLAN_TAG(Control_2) (u16)(Control_2 & MASK_VLAN_TAG)
105486387e1aSJeff Kirsher /*
105586387e1aSJeff Kirsher  * Prototype declaration.
105686387e1aSJeff Kirsher  */
10571dd06ae8SGreg Kroah-Hartman static int s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre);
10583a036ce5SBill Pemberton static void s2io_rem_nic(struct pci_dev *pdev);
105986387e1aSJeff Kirsher static int init_shared_mem(struct s2io_nic *sp);
106086387e1aSJeff Kirsher static void free_shared_mem(struct s2io_nic *sp);
106186387e1aSJeff Kirsher static int init_nic(struct s2io_nic *nic);
106286387e1aSJeff Kirsher static int rx_intr_handler(struct ring_info *ring_data, int budget);
106386387e1aSJeff Kirsher static void s2io_txpic_intr_handle(struct s2io_nic *sp);
106486387e1aSJeff Kirsher static void tx_intr_handler(struct fifo_info *fifo_data);
106586387e1aSJeff Kirsher static void s2io_handle_errors(void * dev_id);
106686387e1aSJeff Kirsher 
10670290bd29SMichael S. Tsirkin static void s2io_tx_watchdog(struct net_device *dev, unsigned int txqueue);
10685ce7f3f4SSebastian Andrzej Siewior static void s2io_set_multicast(struct net_device *dev, bool may_sleep);
106986387e1aSJeff Kirsher static int rx_osm_handler(struct ring_info *ring_data, struct RxD_t * rxdp);
107086387e1aSJeff Kirsher static void s2io_link(struct s2io_nic * sp, int link);
107186387e1aSJeff Kirsher static void s2io_reset(struct s2io_nic * sp);
107286387e1aSJeff Kirsher static int s2io_poll_msix(struct napi_struct *napi, int budget);
107386387e1aSJeff Kirsher static int s2io_poll_inta(struct napi_struct *napi, int budget);
107486387e1aSJeff Kirsher static void s2io_init_pci(struct s2io_nic * sp);
1075*76660757SJakub Kicinski static int do_s2io_prog_unicast(struct net_device *dev, const u8 *addr);
1076e84a2ac9SKees Cook static void s2io_alarm_handle(struct timer_list *t);
107786387e1aSJeff Kirsher static irqreturn_t
107886387e1aSJeff Kirsher s2io_msix_ring_handle(int irq, void *dev_id);
107986387e1aSJeff Kirsher static irqreturn_t
108086387e1aSJeff Kirsher s2io_msix_fifo_handle(int irq, void *dev_id);
108186387e1aSJeff Kirsher static irqreturn_t s2io_isr(int irq, void *dev_id);
108286387e1aSJeff Kirsher static int verify_xena_quiescence(struct s2io_nic *sp);
108386387e1aSJeff Kirsher static const struct ethtool_ops netdev_ethtool_ops;
108486387e1aSJeff Kirsher static void s2io_set_link(struct work_struct *work);
108586387e1aSJeff Kirsher static int s2io_set_swapper(struct s2io_nic * sp);
108686387e1aSJeff Kirsher static void s2io_card_down(struct s2io_nic *nic);
108786387e1aSJeff Kirsher static int s2io_card_up(struct s2io_nic *nic);
108886387e1aSJeff Kirsher static int wait_for_cmd_complete(void __iomem *addr, u64 busy_bit,
10895ce7f3f4SSebastian Andrzej Siewior 				 int bit_state, bool may_sleep);
109086387e1aSJeff Kirsher static int s2io_add_isr(struct s2io_nic * sp);
109186387e1aSJeff Kirsher static void s2io_rem_isr(struct s2io_nic * sp);
109286387e1aSJeff Kirsher 
109386387e1aSJeff Kirsher static void restore_xmsi_data(struct s2io_nic *nic);
109486387e1aSJeff Kirsher static void do_s2io_store_unicast_mc(struct s2io_nic *sp);
109586387e1aSJeff Kirsher static void do_s2io_restore_unicast_mc(struct s2io_nic *sp);
109686387e1aSJeff Kirsher static u64 do_s2io_read_unicast_mc(struct s2io_nic *sp, int offset);
109786387e1aSJeff Kirsher static int do_s2io_add_mc(struct s2io_nic *sp, u8 *addr);
109886387e1aSJeff Kirsher static int do_s2io_add_mac(struct s2io_nic *sp, u64 addr, int offset);
109986387e1aSJeff Kirsher static int do_s2io_delete_unicast_mc(struct s2io_nic *sp, u64 addr);
110086387e1aSJeff Kirsher 
110186387e1aSJeff Kirsher static int s2io_club_tcp_session(struct ring_info *ring_data, u8 *buffer,
110286387e1aSJeff Kirsher 	u8 **tcp, u32 *tcp_len, struct lro **lro, struct RxD_t *rxdp,
110386387e1aSJeff Kirsher 	struct s2io_nic *sp);
110486387e1aSJeff Kirsher static void clear_lro_session(struct lro *lro);
110586387e1aSJeff Kirsher static void queue_rx_frame(struct sk_buff *skb, u16 vlan_tag);
110686387e1aSJeff Kirsher static void update_L3L4_header(struct s2io_nic *sp, struct lro *lro);
110786387e1aSJeff Kirsher static void lro_append_pkt(struct s2io_nic *sp, struct lro *lro,
110886387e1aSJeff Kirsher 			   struct sk_buff *skb, u32 tcp_len);
110986387e1aSJeff Kirsher static int rts_ds_steer(struct s2io_nic *nic, u8 ds_codepoint, u8 ring);
111086387e1aSJeff Kirsher 
111186387e1aSJeff Kirsher static pci_ers_result_t s2io_io_error_detected(struct pci_dev *pdev,
111286387e1aSJeff Kirsher 			                      pci_channel_state_t state);
111386387e1aSJeff Kirsher static pci_ers_result_t s2io_io_slot_reset(struct pci_dev *pdev);
111486387e1aSJeff Kirsher static void s2io_io_resume(struct pci_dev *pdev);
111586387e1aSJeff Kirsher 
111686387e1aSJeff Kirsher #define s2io_tcp_mss(skb) skb_shinfo(skb)->gso_size
111786387e1aSJeff Kirsher #define s2io_udp_mss(skb) skb_shinfo(skb)->gso_size
111886387e1aSJeff Kirsher #define s2io_offload_type(skb) skb_shinfo(skb)->gso_type
111986387e1aSJeff Kirsher 
112086387e1aSJeff Kirsher #define S2IO_PARM_INT(X, def_val) \
112186387e1aSJeff Kirsher 	static unsigned int X = def_val;\
112286387e1aSJeff Kirsher 		module_param(X , uint, 0);
112386387e1aSJeff Kirsher 
112486387e1aSJeff Kirsher #endif				/* _S2IO_H */
1125