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