162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright (c) 2005-2008 Chelsio, Inc. All rights reserved.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This software is available to you under a choice of one of two
562306a36Sopenharmony_ci * licenses.  You may choose to be licensed under the terms of the GNU
662306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file
762306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the
862306a36Sopenharmony_ci * OpenIB.org BSD license below:
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci *     Redistribution and use in source and binary forms, with or
1162306a36Sopenharmony_ci *     without modification, are permitted provided that the following
1262306a36Sopenharmony_ci *     conditions are met:
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci *      - Redistributions of source code must retain the above
1562306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
1662306a36Sopenharmony_ci *        disclaimer.
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci *      - Redistributions in binary form must reproduce the above
1962306a36Sopenharmony_ci *        copyright notice, this list of conditions and the following
2062306a36Sopenharmony_ci *        disclaimer in the documentation and/or other materials
2162306a36Sopenharmony_ci *        provided with the distribution.
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2462306a36Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2562306a36Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
2662306a36Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
2762306a36Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
2862306a36Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2962306a36Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3062306a36Sopenharmony_ci * SOFTWARE.
3162306a36Sopenharmony_ci */
3262306a36Sopenharmony_ci#ifndef __CHELSIO_COMMON_H
3362306a36Sopenharmony_ci#define __CHELSIO_COMMON_H
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#include <linux/kernel.h>
3662306a36Sopenharmony_ci#include <linux/types.h>
3762306a36Sopenharmony_ci#include <linux/ctype.h>
3862306a36Sopenharmony_ci#include <linux/delay.h>
3962306a36Sopenharmony_ci#include <linux/netdevice.h>
4062306a36Sopenharmony_ci#include <linux/ethtool.h>
4162306a36Sopenharmony_ci#include <linux/mdio.h>
4262306a36Sopenharmony_ci#include "version.h"
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define CH_ERR(adap, fmt, ...)   dev_err(&adap->pdev->dev, fmt, ##__VA_ARGS__)
4562306a36Sopenharmony_ci#define CH_WARN(adap, fmt, ...)  dev_warn(&adap->pdev->dev, fmt, ##__VA_ARGS__)
4662306a36Sopenharmony_ci#define CH_ALERT(adap, fmt, ...) dev_alert(&adap->pdev->dev, fmt, ##__VA_ARGS__)
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/*
4962306a36Sopenharmony_ci * More powerful macro that selectively prints messages based on msg_enable.
5062306a36Sopenharmony_ci * For info and debugging messages.
5162306a36Sopenharmony_ci */
5262306a36Sopenharmony_ci#define CH_MSG(adapter, level, category, fmt, ...) do { \
5362306a36Sopenharmony_ci	if ((adapter)->msg_enable & NETIF_MSG_##category) \
5462306a36Sopenharmony_ci		dev_printk(KERN_##level, &adapter->pdev->dev, fmt, \
5562306a36Sopenharmony_ci			   ## __VA_ARGS__); \
5662306a36Sopenharmony_ci} while (0)
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#ifdef DEBUG
5962306a36Sopenharmony_ci# define CH_DBG(adapter, category, fmt, ...) \
6062306a36Sopenharmony_ci	CH_MSG(adapter, DEBUG, category, fmt, ## __VA_ARGS__)
6162306a36Sopenharmony_ci#else
6262306a36Sopenharmony_ci# define CH_DBG(adapter, category, fmt, ...)
6362306a36Sopenharmony_ci#endif
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/* Additional NETIF_MSG_* categories */
6662306a36Sopenharmony_ci#define NETIF_MSG_MMIO 0x8000000
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cienum {
6962306a36Sopenharmony_ci	MAX_NPORTS = 2,		/* max # of ports */
7062306a36Sopenharmony_ci	MAX_FRAME_SIZE = 10240,	/* max MAC frame size, including header + FCS */
7162306a36Sopenharmony_ci	EEPROMSIZE = 8192,	/* Serial EEPROM size */
7262306a36Sopenharmony_ci	SERNUM_LEN     = 16,    /* Serial # length */
7362306a36Sopenharmony_ci	RSS_TABLE_SIZE = 64,	/* size of RSS lookup and mapping tables */
7462306a36Sopenharmony_ci	TCB_SIZE = 128,		/* TCB size */
7562306a36Sopenharmony_ci	NMTUS = 16,		/* size of MTU table */
7662306a36Sopenharmony_ci	NCCTRL_WIN = 32,	/* # of congestion control windows */
7762306a36Sopenharmony_ci	PROTO_SRAM_LINES = 128, /* size of TP sram */
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#define MAX_RX_COALESCING_LEN 12288U
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cienum {
8362306a36Sopenharmony_ci	PAUSE_RX = 1 << 0,
8462306a36Sopenharmony_ci	PAUSE_TX = 1 << 1,
8562306a36Sopenharmony_ci	PAUSE_AUTONEG = 1 << 2
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cienum {
8962306a36Sopenharmony_ci	SUPPORTED_IRQ      = 1 << 24
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cienum {				/* adapter interrupt-maintained statistics */
9362306a36Sopenharmony_ci	STAT_ULP_CH0_PBL_OOB,
9462306a36Sopenharmony_ci	STAT_ULP_CH1_PBL_OOB,
9562306a36Sopenharmony_ci	STAT_PCI_CORR_ECC,
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	IRQ_NUM_STATS		/* keep last */
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci#define TP_VERSION_MAJOR	1
10162306a36Sopenharmony_ci#define TP_VERSION_MINOR	1
10262306a36Sopenharmony_ci#define TP_VERSION_MICRO	0
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#define S_TP_VERSION_MAJOR		16
10562306a36Sopenharmony_ci#define M_TP_VERSION_MAJOR		0xFF
10662306a36Sopenharmony_ci#define V_TP_VERSION_MAJOR(x)		((x) << S_TP_VERSION_MAJOR)
10762306a36Sopenharmony_ci#define G_TP_VERSION_MAJOR(x)		\
10862306a36Sopenharmony_ci	    (((x) >> S_TP_VERSION_MAJOR) & M_TP_VERSION_MAJOR)
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#define S_TP_VERSION_MINOR		8
11162306a36Sopenharmony_ci#define M_TP_VERSION_MINOR		0xFF
11262306a36Sopenharmony_ci#define V_TP_VERSION_MINOR(x)		((x) << S_TP_VERSION_MINOR)
11362306a36Sopenharmony_ci#define G_TP_VERSION_MINOR(x)		\
11462306a36Sopenharmony_ci	    (((x) >> S_TP_VERSION_MINOR) & M_TP_VERSION_MINOR)
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define S_TP_VERSION_MICRO		0
11762306a36Sopenharmony_ci#define M_TP_VERSION_MICRO		0xFF
11862306a36Sopenharmony_ci#define V_TP_VERSION_MICRO(x)		((x) << S_TP_VERSION_MICRO)
11962306a36Sopenharmony_ci#define G_TP_VERSION_MICRO(x)		\
12062306a36Sopenharmony_ci	    (((x) >> S_TP_VERSION_MICRO) & M_TP_VERSION_MICRO)
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cienum {
12362306a36Sopenharmony_ci	SGE_QSETS = 8,		/* # of SGE Tx/Rx/RspQ sets */
12462306a36Sopenharmony_ci	SGE_RXQ_PER_SET = 2,	/* # of Rx queues per set */
12562306a36Sopenharmony_ci	SGE_TXQ_PER_SET = 3	/* # of Tx queues per set */
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cienum sge_context_type {		/* SGE egress context types */
12962306a36Sopenharmony_ci	SGE_CNTXT_RDMA = 0,
13062306a36Sopenharmony_ci	SGE_CNTXT_ETH = 2,
13162306a36Sopenharmony_ci	SGE_CNTXT_OFLD = 4,
13262306a36Sopenharmony_ci	SGE_CNTXT_CTRL = 5
13362306a36Sopenharmony_ci};
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cienum {
13662306a36Sopenharmony_ci	AN_PKT_SIZE = 32,	/* async notification packet size */
13762306a36Sopenharmony_ci	IMMED_PKT_SIZE = 48	/* packet size for immediate data */
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistruct sg_ent {			/* SGE scatter/gather entry */
14162306a36Sopenharmony_ci	__be32 len[2];
14262306a36Sopenharmony_ci	__be64 addr[2];
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci#ifndef SGE_NUM_GENBITS
14662306a36Sopenharmony_ci/* Must be 1 or 2 */
14762306a36Sopenharmony_ci# define SGE_NUM_GENBITS 2
14862306a36Sopenharmony_ci#endif
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define TX_DESC_FLITS 16U
15162306a36Sopenharmony_ci#define WR_FLITS (TX_DESC_FLITS + 1 - SGE_NUM_GENBITS)
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistruct cphy;
15462306a36Sopenharmony_cistruct adapter;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_cistruct mdio_ops {
15762306a36Sopenharmony_ci	int (*read)(struct net_device *dev, int phy_addr, int mmd_addr,
15862306a36Sopenharmony_ci		    u16 reg_addr);
15962306a36Sopenharmony_ci	int (*write)(struct net_device *dev, int phy_addr, int mmd_addr,
16062306a36Sopenharmony_ci		     u16 reg_addr, u16 val);
16162306a36Sopenharmony_ci	unsigned mode_support;
16262306a36Sopenharmony_ci};
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistruct adapter_info {
16562306a36Sopenharmony_ci	unsigned char nports0;        /* # of ports on channel 0 */
16662306a36Sopenharmony_ci	unsigned char nports1;        /* # of ports on channel 1 */
16762306a36Sopenharmony_ci	unsigned char phy_base_addr;	/* MDIO PHY base address */
16862306a36Sopenharmony_ci	unsigned int gpio_out;	/* GPIO output settings */
16962306a36Sopenharmony_ci	unsigned char gpio_intr[MAX_NPORTS]; /* GPIO PHY IRQ pins */
17062306a36Sopenharmony_ci	unsigned long caps;	/* adapter capabilities */
17162306a36Sopenharmony_ci	const struct mdio_ops *mdio_ops;	/* MDIO operations */
17262306a36Sopenharmony_ci	const char *desc;	/* product description */
17362306a36Sopenharmony_ci};
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cistruct mc5_stats {
17662306a36Sopenharmony_ci	unsigned long parity_err;
17762306a36Sopenharmony_ci	unsigned long active_rgn_full;
17862306a36Sopenharmony_ci	unsigned long nfa_srch_err;
17962306a36Sopenharmony_ci	unsigned long unknown_cmd;
18062306a36Sopenharmony_ci	unsigned long reqq_parity_err;
18162306a36Sopenharmony_ci	unsigned long dispq_parity_err;
18262306a36Sopenharmony_ci	unsigned long del_act_empty;
18362306a36Sopenharmony_ci};
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistruct mc7_stats {
18662306a36Sopenharmony_ci	unsigned long corr_err;
18762306a36Sopenharmony_ci	unsigned long uncorr_err;
18862306a36Sopenharmony_ci	unsigned long parity_err;
18962306a36Sopenharmony_ci	unsigned long addr_err;
19062306a36Sopenharmony_ci};
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_cistruct mac_stats {
19362306a36Sopenharmony_ci	u64 tx_octets;		/* total # of octets in good frames */
19462306a36Sopenharmony_ci	u64 tx_octets_bad;	/* total # of octets in error frames */
19562306a36Sopenharmony_ci	u64 tx_frames;		/* all good frames */
19662306a36Sopenharmony_ci	u64 tx_mcast_frames;	/* good multicast frames */
19762306a36Sopenharmony_ci	u64 tx_bcast_frames;	/* good broadcast frames */
19862306a36Sopenharmony_ci	u64 tx_pause;		/* # of transmitted pause frames */
19962306a36Sopenharmony_ci	u64 tx_deferred;	/* frames with deferred transmissions */
20062306a36Sopenharmony_ci	u64 tx_late_collisions;	/* # of late collisions */
20162306a36Sopenharmony_ci	u64 tx_total_collisions;	/* # of total collisions */
20262306a36Sopenharmony_ci	u64 tx_excess_collisions;	/* frame errors from excessive collissions */
20362306a36Sopenharmony_ci	u64 tx_underrun;	/* # of Tx FIFO underruns */
20462306a36Sopenharmony_ci	u64 tx_len_errs;	/* # of Tx length errors */
20562306a36Sopenharmony_ci	u64 tx_mac_internal_errs;	/* # of internal MAC errors on Tx */
20662306a36Sopenharmony_ci	u64 tx_excess_deferral;	/* # of frames with excessive deferral */
20762306a36Sopenharmony_ci	u64 tx_fcs_errs;	/* # of frames with bad FCS */
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci	u64 tx_frames_64;	/* # of Tx frames in a particular range */
21062306a36Sopenharmony_ci	u64 tx_frames_65_127;
21162306a36Sopenharmony_ci	u64 tx_frames_128_255;
21262306a36Sopenharmony_ci	u64 tx_frames_256_511;
21362306a36Sopenharmony_ci	u64 tx_frames_512_1023;
21462306a36Sopenharmony_ci	u64 tx_frames_1024_1518;
21562306a36Sopenharmony_ci	u64 tx_frames_1519_max;
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	u64 rx_octets;		/* total # of octets in good frames */
21862306a36Sopenharmony_ci	u64 rx_octets_bad;	/* total # of octets in error frames */
21962306a36Sopenharmony_ci	u64 rx_frames;		/* all good frames */
22062306a36Sopenharmony_ci	u64 rx_mcast_frames;	/* good multicast frames */
22162306a36Sopenharmony_ci	u64 rx_bcast_frames;	/* good broadcast frames */
22262306a36Sopenharmony_ci	u64 rx_pause;		/* # of received pause frames */
22362306a36Sopenharmony_ci	u64 rx_fcs_errs;	/* # of received frames with bad FCS */
22462306a36Sopenharmony_ci	u64 rx_align_errs;	/* alignment errors */
22562306a36Sopenharmony_ci	u64 rx_symbol_errs;	/* symbol errors */
22662306a36Sopenharmony_ci	u64 rx_data_errs;	/* data errors */
22762306a36Sopenharmony_ci	u64 rx_sequence_errs;	/* sequence errors */
22862306a36Sopenharmony_ci	u64 rx_runt;		/* # of runt frames */
22962306a36Sopenharmony_ci	u64 rx_jabber;		/* # of jabber frames */
23062306a36Sopenharmony_ci	u64 rx_short;		/* # of short frames */
23162306a36Sopenharmony_ci	u64 rx_too_long;	/* # of oversized frames */
23262306a36Sopenharmony_ci	u64 rx_mac_internal_errs;	/* # of internal MAC errors on Rx */
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	u64 rx_frames_64;	/* # of Rx frames in a particular range */
23562306a36Sopenharmony_ci	u64 rx_frames_65_127;
23662306a36Sopenharmony_ci	u64 rx_frames_128_255;
23762306a36Sopenharmony_ci	u64 rx_frames_256_511;
23862306a36Sopenharmony_ci	u64 rx_frames_512_1023;
23962306a36Sopenharmony_ci	u64 rx_frames_1024_1518;
24062306a36Sopenharmony_ci	u64 rx_frames_1519_max;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	u64 rx_cong_drops;	/* # of Rx drops due to SGE congestion */
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	unsigned long tx_fifo_parity_err;
24562306a36Sopenharmony_ci	unsigned long rx_fifo_parity_err;
24662306a36Sopenharmony_ci	unsigned long tx_fifo_urun;
24762306a36Sopenharmony_ci	unsigned long rx_fifo_ovfl;
24862306a36Sopenharmony_ci	unsigned long serdes_signal_loss;
24962306a36Sopenharmony_ci	unsigned long xaui_pcs_ctc_err;
25062306a36Sopenharmony_ci	unsigned long xaui_pcs_align_change;
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	unsigned long num_toggled; /* # times toggled TxEn due to stuck TX */
25362306a36Sopenharmony_ci	unsigned long num_resets;  /* # times reset due to stuck TX */
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	unsigned long link_faults;  /* # detected link faults */
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistruct tp_mib_stats {
25962306a36Sopenharmony_ci	u32 ipInReceive_hi;
26062306a36Sopenharmony_ci	u32 ipInReceive_lo;
26162306a36Sopenharmony_ci	u32 ipInHdrErrors_hi;
26262306a36Sopenharmony_ci	u32 ipInHdrErrors_lo;
26362306a36Sopenharmony_ci	u32 ipInAddrErrors_hi;
26462306a36Sopenharmony_ci	u32 ipInAddrErrors_lo;
26562306a36Sopenharmony_ci	u32 ipInUnknownProtos_hi;
26662306a36Sopenharmony_ci	u32 ipInUnknownProtos_lo;
26762306a36Sopenharmony_ci	u32 ipInDiscards_hi;
26862306a36Sopenharmony_ci	u32 ipInDiscards_lo;
26962306a36Sopenharmony_ci	u32 ipInDelivers_hi;
27062306a36Sopenharmony_ci	u32 ipInDelivers_lo;
27162306a36Sopenharmony_ci	u32 ipOutRequests_hi;
27262306a36Sopenharmony_ci	u32 ipOutRequests_lo;
27362306a36Sopenharmony_ci	u32 ipOutDiscards_hi;
27462306a36Sopenharmony_ci	u32 ipOutDiscards_lo;
27562306a36Sopenharmony_ci	u32 ipOutNoRoutes_hi;
27662306a36Sopenharmony_ci	u32 ipOutNoRoutes_lo;
27762306a36Sopenharmony_ci	u32 ipReasmTimeout;
27862306a36Sopenharmony_ci	u32 ipReasmReqds;
27962306a36Sopenharmony_ci	u32 ipReasmOKs;
28062306a36Sopenharmony_ci	u32 ipReasmFails;
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci	u32 reserved[8];
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci	u32 tcpActiveOpens;
28562306a36Sopenharmony_ci	u32 tcpPassiveOpens;
28662306a36Sopenharmony_ci	u32 tcpAttemptFails;
28762306a36Sopenharmony_ci	u32 tcpEstabResets;
28862306a36Sopenharmony_ci	u32 tcpOutRsts;
28962306a36Sopenharmony_ci	u32 tcpCurrEstab;
29062306a36Sopenharmony_ci	u32 tcpInSegs_hi;
29162306a36Sopenharmony_ci	u32 tcpInSegs_lo;
29262306a36Sopenharmony_ci	u32 tcpOutSegs_hi;
29362306a36Sopenharmony_ci	u32 tcpOutSegs_lo;
29462306a36Sopenharmony_ci	u32 tcpRetransSeg_hi;
29562306a36Sopenharmony_ci	u32 tcpRetransSeg_lo;
29662306a36Sopenharmony_ci	u32 tcpInErrs_hi;
29762306a36Sopenharmony_ci	u32 tcpInErrs_lo;
29862306a36Sopenharmony_ci	u32 tcpRtoMin;
29962306a36Sopenharmony_ci	u32 tcpRtoMax;
30062306a36Sopenharmony_ci};
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_cistruct tp_params {
30362306a36Sopenharmony_ci	unsigned int nchan;	/* # of channels */
30462306a36Sopenharmony_ci	unsigned int pmrx_size;	/* total PMRX capacity */
30562306a36Sopenharmony_ci	unsigned int pmtx_size;	/* total PMTX capacity */
30662306a36Sopenharmony_ci	unsigned int cm_size;	/* total CM capacity */
30762306a36Sopenharmony_ci	unsigned int chan_rx_size;	/* per channel Rx size */
30862306a36Sopenharmony_ci	unsigned int chan_tx_size;	/* per channel Tx size */
30962306a36Sopenharmony_ci	unsigned int rx_pg_size;	/* Rx page size */
31062306a36Sopenharmony_ci	unsigned int tx_pg_size;	/* Tx page size */
31162306a36Sopenharmony_ci	unsigned int rx_num_pgs;	/* # of Rx pages */
31262306a36Sopenharmony_ci	unsigned int tx_num_pgs;	/* # of Tx pages */
31362306a36Sopenharmony_ci	unsigned int ntimer_qs;	/* # of timer queues */
31462306a36Sopenharmony_ci};
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_cistruct qset_params {		/* SGE queue set parameters */
31762306a36Sopenharmony_ci	unsigned int polling;	/* polling/interrupt service for rspq */
31862306a36Sopenharmony_ci	unsigned int coalesce_usecs;	/* irq coalescing timer */
31962306a36Sopenharmony_ci	unsigned int rspq_size;	/* # of entries in response queue */
32062306a36Sopenharmony_ci	unsigned int fl_size;	/* # of entries in regular free list */
32162306a36Sopenharmony_ci	unsigned int jumbo_size;	/* # of entries in jumbo free list */
32262306a36Sopenharmony_ci	unsigned int txq_size[SGE_TXQ_PER_SET];	/* Tx queue sizes */
32362306a36Sopenharmony_ci	unsigned int cong_thres;	/* FL congestion threshold */
32462306a36Sopenharmony_ci	unsigned int vector;		/* Interrupt (line or vector) number */
32562306a36Sopenharmony_ci};
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_cistruct sge_params {
32862306a36Sopenharmony_ci	unsigned int max_pkt_size;	/* max offload pkt size */
32962306a36Sopenharmony_ci	struct qset_params qset[SGE_QSETS];
33062306a36Sopenharmony_ci};
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cistruct mc5_params {
33362306a36Sopenharmony_ci	unsigned int mode;	/* selects MC5 width */
33462306a36Sopenharmony_ci	unsigned int nservers;	/* size of server region */
33562306a36Sopenharmony_ci	unsigned int nfilters;	/* size of filter region */
33662306a36Sopenharmony_ci	unsigned int nroutes;	/* size of routing region */
33762306a36Sopenharmony_ci};
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci/* Default MC5 region sizes */
34062306a36Sopenharmony_cienum {
34162306a36Sopenharmony_ci	DEFAULT_NSERVERS = 512,
34262306a36Sopenharmony_ci	DEFAULT_NFILTERS = 128
34362306a36Sopenharmony_ci};
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/* MC5 modes, these must be non-0 */
34662306a36Sopenharmony_cienum {
34762306a36Sopenharmony_ci	MC5_MODE_144_BIT = 1,
34862306a36Sopenharmony_ci	MC5_MODE_72_BIT = 2
34962306a36Sopenharmony_ci};
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci/* MC5 min active region size */
35262306a36Sopenharmony_cienum { MC5_MIN_TIDS = 16 };
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_cistruct vpd_params {
35562306a36Sopenharmony_ci	unsigned int cclk;
35662306a36Sopenharmony_ci	unsigned int mclk;
35762306a36Sopenharmony_ci	unsigned int uclk;
35862306a36Sopenharmony_ci	unsigned int mdc;
35962306a36Sopenharmony_ci	unsigned int mem_timing;
36062306a36Sopenharmony_ci	u8 sn[SERNUM_LEN + 1];
36162306a36Sopenharmony_ci	u8 eth_base[6];
36262306a36Sopenharmony_ci	u8 port_type[MAX_NPORTS];
36362306a36Sopenharmony_ci	unsigned short xauicfg[2];
36462306a36Sopenharmony_ci};
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_cistruct pci_params {
36762306a36Sopenharmony_ci	unsigned int vpd_cap_addr;
36862306a36Sopenharmony_ci	unsigned short speed;
36962306a36Sopenharmony_ci	unsigned char width;
37062306a36Sopenharmony_ci	unsigned char variant;
37162306a36Sopenharmony_ci};
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_cienum {
37462306a36Sopenharmony_ci	PCI_VARIANT_PCI,
37562306a36Sopenharmony_ci	PCI_VARIANT_PCIX_MODE1_PARITY,
37662306a36Sopenharmony_ci	PCI_VARIANT_PCIX_MODE1_ECC,
37762306a36Sopenharmony_ci	PCI_VARIANT_PCIX_266_MODE2,
37862306a36Sopenharmony_ci	PCI_VARIANT_PCIE
37962306a36Sopenharmony_ci};
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_cistruct adapter_params {
38262306a36Sopenharmony_ci	struct sge_params sge;
38362306a36Sopenharmony_ci	struct mc5_params mc5;
38462306a36Sopenharmony_ci	struct tp_params tp;
38562306a36Sopenharmony_ci	struct vpd_params vpd;
38662306a36Sopenharmony_ci	struct pci_params pci;
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci	const struct adapter_info *info;
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	unsigned short mtus[NMTUS];
39162306a36Sopenharmony_ci	unsigned short a_wnd[NCCTRL_WIN];
39262306a36Sopenharmony_ci	unsigned short b_wnd[NCCTRL_WIN];
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	unsigned int nports;	/* # of ethernet ports */
39562306a36Sopenharmony_ci	unsigned int chan_map;  /* bitmap of in-use Tx channels */
39662306a36Sopenharmony_ci	unsigned int stats_update_period;	/* MAC stats accumulation period */
39762306a36Sopenharmony_ci	unsigned int linkpoll_period;	/* link poll period in 0.1s */
39862306a36Sopenharmony_ci	unsigned int rev;	/* chip revision */
39962306a36Sopenharmony_ci	unsigned int offload;
40062306a36Sopenharmony_ci};
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_cienum {					    /* chip revisions */
40362306a36Sopenharmony_ci	T3_REV_A  = 0,
40462306a36Sopenharmony_ci	T3_REV_B  = 2,
40562306a36Sopenharmony_ci	T3_REV_B2 = 3,
40662306a36Sopenharmony_ci	T3_REV_C  = 4,
40762306a36Sopenharmony_ci};
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_cistruct trace_params {
41062306a36Sopenharmony_ci	u32 sip;
41162306a36Sopenharmony_ci	u32 sip_mask;
41262306a36Sopenharmony_ci	u32 dip;
41362306a36Sopenharmony_ci	u32 dip_mask;
41462306a36Sopenharmony_ci	u16 sport;
41562306a36Sopenharmony_ci	u16 sport_mask;
41662306a36Sopenharmony_ci	u16 dport;
41762306a36Sopenharmony_ci	u16 dport_mask;
41862306a36Sopenharmony_ci	u32 vlan:12;
41962306a36Sopenharmony_ci	u32 vlan_mask:12;
42062306a36Sopenharmony_ci	u32 intf:4;
42162306a36Sopenharmony_ci	u32 intf_mask:4;
42262306a36Sopenharmony_ci	u8 proto;
42362306a36Sopenharmony_ci	u8 proto_mask;
42462306a36Sopenharmony_ci};
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_cistruct link_config {
42762306a36Sopenharmony_ci	unsigned int supported;	/* link capabilities */
42862306a36Sopenharmony_ci	unsigned int advertising;	/* advertised capabilities */
42962306a36Sopenharmony_ci	unsigned short requested_speed;	/* speed user has requested */
43062306a36Sopenharmony_ci	unsigned short speed;	/* actual link speed */
43162306a36Sopenharmony_ci	unsigned char requested_duplex;	/* duplex user has requested */
43262306a36Sopenharmony_ci	unsigned char duplex;	/* actual link duplex */
43362306a36Sopenharmony_ci	unsigned char requested_fc;	/* flow control user has requested */
43462306a36Sopenharmony_ci	unsigned char fc;	/* actual link flow control */
43562306a36Sopenharmony_ci	unsigned char autoneg;	/* autonegotiating? */
43662306a36Sopenharmony_ci	unsigned int link_ok;	/* link up? */
43762306a36Sopenharmony_ci};
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci#define SPEED_INVALID   0xffff
44062306a36Sopenharmony_ci#define DUPLEX_INVALID  0xff
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_cistruct mc5 {
44362306a36Sopenharmony_ci	struct adapter *adapter;
44462306a36Sopenharmony_ci	unsigned int tcam_size;
44562306a36Sopenharmony_ci	unsigned char part_type;
44662306a36Sopenharmony_ci	unsigned char parity_enabled;
44762306a36Sopenharmony_ci	unsigned char mode;
44862306a36Sopenharmony_ci	struct mc5_stats stats;
44962306a36Sopenharmony_ci};
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_cistatic inline unsigned int t3_mc5_size(const struct mc5 *p)
45262306a36Sopenharmony_ci{
45362306a36Sopenharmony_ci	return p->tcam_size;
45462306a36Sopenharmony_ci}
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_cistruct mc7 {
45762306a36Sopenharmony_ci	struct adapter *adapter;	/* backpointer to adapter */
45862306a36Sopenharmony_ci	unsigned int size;	/* memory size in bytes */
45962306a36Sopenharmony_ci	unsigned int width;	/* MC7 interface width */
46062306a36Sopenharmony_ci	unsigned int offset;	/* register address offset for MC7 instance */
46162306a36Sopenharmony_ci	const char *name;	/* name of MC7 instance */
46262306a36Sopenharmony_ci	struct mc7_stats stats;	/* MC7 statistics */
46362306a36Sopenharmony_ci};
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_cistatic inline unsigned int t3_mc7_size(const struct mc7 *p)
46662306a36Sopenharmony_ci{
46762306a36Sopenharmony_ci	return p->size;
46862306a36Sopenharmony_ci}
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_cistruct cmac {
47162306a36Sopenharmony_ci	struct adapter *adapter;
47262306a36Sopenharmony_ci	unsigned int offset;
47362306a36Sopenharmony_ci	unsigned int nucast;	/* # of address filters for unicast MACs */
47462306a36Sopenharmony_ci	unsigned int tx_tcnt;
47562306a36Sopenharmony_ci	unsigned int tx_xcnt;
47662306a36Sopenharmony_ci	u64 tx_mcnt;
47762306a36Sopenharmony_ci	unsigned int rx_xcnt;
47862306a36Sopenharmony_ci	unsigned int rx_ocnt;
47962306a36Sopenharmony_ci	u64 rx_mcnt;
48062306a36Sopenharmony_ci	unsigned int toggle_cnt;
48162306a36Sopenharmony_ci	unsigned int txen;
48262306a36Sopenharmony_ci	u64 rx_pause;
48362306a36Sopenharmony_ci	struct mac_stats stats;
48462306a36Sopenharmony_ci};
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_cienum {
48762306a36Sopenharmony_ci	MAC_DIRECTION_RX = 1,
48862306a36Sopenharmony_ci	MAC_DIRECTION_TX = 2,
48962306a36Sopenharmony_ci	MAC_RXFIFO_SIZE = 32768
49062306a36Sopenharmony_ci};
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci/* PHY loopback direction */
49362306a36Sopenharmony_cienum {
49462306a36Sopenharmony_ci	PHY_LOOPBACK_TX = 1,
49562306a36Sopenharmony_ci	PHY_LOOPBACK_RX = 2
49662306a36Sopenharmony_ci};
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci/* PHY interrupt types */
49962306a36Sopenharmony_cienum {
50062306a36Sopenharmony_ci	cphy_cause_link_change = 1,
50162306a36Sopenharmony_ci	cphy_cause_fifo_error = 2,
50262306a36Sopenharmony_ci	cphy_cause_module_change = 4,
50362306a36Sopenharmony_ci};
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci/* PHY module types */
50662306a36Sopenharmony_cienum {
50762306a36Sopenharmony_ci	phy_modtype_none,
50862306a36Sopenharmony_ci	phy_modtype_sr,
50962306a36Sopenharmony_ci	phy_modtype_lr,
51062306a36Sopenharmony_ci	phy_modtype_lrm,
51162306a36Sopenharmony_ci	phy_modtype_twinax,
51262306a36Sopenharmony_ci	phy_modtype_twinax_long,
51362306a36Sopenharmony_ci	phy_modtype_unknown
51462306a36Sopenharmony_ci};
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci/* PHY operations */
51762306a36Sopenharmony_cistruct cphy_ops {
51862306a36Sopenharmony_ci	int (*reset)(struct cphy *phy, int wait);
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci	int (*intr_enable)(struct cphy *phy);
52162306a36Sopenharmony_ci	int (*intr_disable)(struct cphy *phy);
52262306a36Sopenharmony_ci	int (*intr_clear)(struct cphy *phy);
52362306a36Sopenharmony_ci	int (*intr_handler)(struct cphy *phy);
52462306a36Sopenharmony_ci
52562306a36Sopenharmony_ci	int (*autoneg_enable)(struct cphy *phy);
52662306a36Sopenharmony_ci	int (*autoneg_restart)(struct cphy *phy);
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci	int (*advertise)(struct cphy *phy, unsigned int advertise_map);
52962306a36Sopenharmony_ci	int (*set_loopback)(struct cphy *phy, int mmd, int dir, int enable);
53062306a36Sopenharmony_ci	int (*set_speed_duplex)(struct cphy *phy, int speed, int duplex);
53162306a36Sopenharmony_ci	int (*get_link_status)(struct cphy *phy, int *link_ok, int *speed,
53262306a36Sopenharmony_ci			       int *duplex, int *fc);
53362306a36Sopenharmony_ci	int (*power_down)(struct cphy *phy, int enable);
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ci	u32 mmds;
53662306a36Sopenharmony_ci};
53762306a36Sopenharmony_cienum {
53862306a36Sopenharmony_ci	EDC_OPT_AEL2005 = 0,
53962306a36Sopenharmony_ci	EDC_OPT_AEL2005_SIZE = 1084,
54062306a36Sopenharmony_ci	EDC_TWX_AEL2005 = 1,
54162306a36Sopenharmony_ci	EDC_TWX_AEL2005_SIZE = 1464,
54262306a36Sopenharmony_ci	EDC_TWX_AEL2020 = 2,
54362306a36Sopenharmony_ci	EDC_TWX_AEL2020_SIZE = 1628,
54462306a36Sopenharmony_ci	EDC_MAX_SIZE = EDC_TWX_AEL2020_SIZE, /* Max cache size */
54562306a36Sopenharmony_ci};
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci/* A PHY instance */
54862306a36Sopenharmony_cistruct cphy {
54962306a36Sopenharmony_ci	u8 modtype;			/* PHY module type */
55062306a36Sopenharmony_ci	short priv;			/* scratch pad */
55162306a36Sopenharmony_ci	unsigned int caps;		/* PHY capabilities */
55262306a36Sopenharmony_ci	struct adapter *adapter;	/* associated adapter */
55362306a36Sopenharmony_ci	const char *desc;		/* PHY description */
55462306a36Sopenharmony_ci	unsigned long fifo_errors;	/* FIFO over/under-flows */
55562306a36Sopenharmony_ci	const struct cphy_ops *ops;	/* PHY operations */
55662306a36Sopenharmony_ci	struct mdio_if_info mdio;
55762306a36Sopenharmony_ci	u16 phy_cache[EDC_MAX_SIZE];	/* EDC cache */
55862306a36Sopenharmony_ci};
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci/* Convenience MDIO read/write wrappers */
56162306a36Sopenharmony_cistatic inline int t3_mdio_read(struct cphy *phy, int mmd, int reg,
56262306a36Sopenharmony_ci			       unsigned int *valp)
56362306a36Sopenharmony_ci{
56462306a36Sopenharmony_ci	int rc = phy->mdio.mdio_read(phy->mdio.dev, phy->mdio.prtad, mmd, reg);
56562306a36Sopenharmony_ci	*valp = (rc >= 0) ? rc : -1;
56662306a36Sopenharmony_ci	return (rc >= 0) ? 0 : rc;
56762306a36Sopenharmony_ci}
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_cistatic inline int t3_mdio_write(struct cphy *phy, int mmd, int reg,
57062306a36Sopenharmony_ci				unsigned int val)
57162306a36Sopenharmony_ci{
57262306a36Sopenharmony_ci	return phy->mdio.mdio_write(phy->mdio.dev, phy->mdio.prtad, mmd,
57362306a36Sopenharmony_ci				    reg, val);
57462306a36Sopenharmony_ci}
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci/* Convenience initializer */
57762306a36Sopenharmony_cistatic inline void cphy_init(struct cphy *phy, struct adapter *adapter,
57862306a36Sopenharmony_ci			     int phy_addr, const struct cphy_ops *phy_ops,
57962306a36Sopenharmony_ci			     const struct mdio_ops *mdio_ops,
58062306a36Sopenharmony_ci			      unsigned int caps, const char *desc)
58162306a36Sopenharmony_ci{
58262306a36Sopenharmony_ci	phy->caps = caps;
58362306a36Sopenharmony_ci	phy->adapter = adapter;
58462306a36Sopenharmony_ci	phy->desc = desc;
58562306a36Sopenharmony_ci	phy->ops = phy_ops;
58662306a36Sopenharmony_ci	if (mdio_ops) {
58762306a36Sopenharmony_ci		phy->mdio.prtad = phy_addr;
58862306a36Sopenharmony_ci		phy->mdio.mmds = phy_ops->mmds;
58962306a36Sopenharmony_ci		phy->mdio.mode_support = mdio_ops->mode_support;
59062306a36Sopenharmony_ci		phy->mdio.mdio_read = mdio_ops->read;
59162306a36Sopenharmony_ci		phy->mdio.mdio_write = mdio_ops->write;
59262306a36Sopenharmony_ci	}
59362306a36Sopenharmony_ci}
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci/* Accumulate MAC statistics every 180 seconds.  For 1G we multiply by 10. */
59662306a36Sopenharmony_ci#define MAC_STATS_ACCUM_SECS 180
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci#define XGM_REG(reg_addr, idx) \
59962306a36Sopenharmony_ci	((reg_addr) + (idx) * (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR))
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_cistruct addr_val_pair {
60262306a36Sopenharmony_ci	unsigned int reg_addr;
60362306a36Sopenharmony_ci	unsigned int val;
60462306a36Sopenharmony_ci};
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci#include "adapter.h"
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci#ifndef PCI_VENDOR_ID_CHELSIO
60962306a36Sopenharmony_ci# define PCI_VENDOR_ID_CHELSIO 0x1425
61062306a36Sopenharmony_ci#endif
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_ci#define for_each_port(adapter, iter) \
61362306a36Sopenharmony_ci	for (iter = 0; iter < (adapter)->params.nports; ++iter)
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci#define adapter_info(adap) ((adap)->params.info)
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_cistatic inline int uses_xaui(const struct adapter *adap)
61862306a36Sopenharmony_ci{
61962306a36Sopenharmony_ci	return adapter_info(adap)->caps & SUPPORTED_AUI;
62062306a36Sopenharmony_ci}
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_cistatic inline int is_10G(const struct adapter *adap)
62362306a36Sopenharmony_ci{
62462306a36Sopenharmony_ci	return adapter_info(adap)->caps & SUPPORTED_10000baseT_Full;
62562306a36Sopenharmony_ci}
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_cistatic inline int is_offload(const struct adapter *adap)
62862306a36Sopenharmony_ci{
62962306a36Sopenharmony_ci	return adap->params.offload;
63062306a36Sopenharmony_ci}
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_cistatic inline unsigned int core_ticks_per_usec(const struct adapter *adap)
63362306a36Sopenharmony_ci{
63462306a36Sopenharmony_ci	return adap->params.vpd.cclk / 1000;
63562306a36Sopenharmony_ci}
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_cistatic inline unsigned int is_pcie(const struct adapter *adap)
63862306a36Sopenharmony_ci{
63962306a36Sopenharmony_ci	return adap->params.pci.variant == PCI_VARIANT_PCIE;
64062306a36Sopenharmony_ci}
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_civoid t3_set_reg_field(struct adapter *adap, unsigned int addr, u32 mask,
64362306a36Sopenharmony_ci		      u32 val);
64462306a36Sopenharmony_civoid t3_write_regs(struct adapter *adapter, const struct addr_val_pair *p,
64562306a36Sopenharmony_ci		   int n, unsigned int offset);
64662306a36Sopenharmony_ciint t3_wait_op_done_val(struct adapter *adapter, int reg, u32 mask,
64762306a36Sopenharmony_ci			int polarity, int attempts, int delay, u32 *valp);
64862306a36Sopenharmony_cistatic inline int t3_wait_op_done(struct adapter *adapter, int reg, u32 mask,
64962306a36Sopenharmony_ci				  int polarity, int attempts, int delay)
65062306a36Sopenharmony_ci{
65162306a36Sopenharmony_ci	return t3_wait_op_done_val(adapter, reg, mask, polarity, attempts,
65262306a36Sopenharmony_ci				   delay, NULL);
65362306a36Sopenharmony_ci}
65462306a36Sopenharmony_ciint t3_mdio_change_bits(struct cphy *phy, int mmd, int reg, unsigned int clear,
65562306a36Sopenharmony_ci			unsigned int set);
65662306a36Sopenharmony_ciint t3_phy_reset(struct cphy *phy, int mmd, int wait);
65762306a36Sopenharmony_ciint t3_phy_advertise(struct cphy *phy, unsigned int advert);
65862306a36Sopenharmony_ciint t3_phy_advertise_fiber(struct cphy *phy, unsigned int advert);
65962306a36Sopenharmony_ciint t3_set_phy_speed_duplex(struct cphy *phy, int speed, int duplex);
66062306a36Sopenharmony_ciint t3_phy_lasi_intr_enable(struct cphy *phy);
66162306a36Sopenharmony_ciint t3_phy_lasi_intr_disable(struct cphy *phy);
66262306a36Sopenharmony_ciint t3_phy_lasi_intr_clear(struct cphy *phy);
66362306a36Sopenharmony_ciint t3_phy_lasi_intr_handler(struct cphy *phy);
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_civoid t3_intr_enable(struct adapter *adapter);
66662306a36Sopenharmony_civoid t3_intr_disable(struct adapter *adapter);
66762306a36Sopenharmony_civoid t3_intr_clear(struct adapter *adapter);
66862306a36Sopenharmony_civoid t3_xgm_intr_enable(struct adapter *adapter, int idx);
66962306a36Sopenharmony_civoid t3_xgm_intr_disable(struct adapter *adapter, int idx);
67062306a36Sopenharmony_civoid t3_port_intr_enable(struct adapter *adapter, int idx);
67162306a36Sopenharmony_civoid t3_port_intr_disable(struct adapter *adapter, int idx);
67262306a36Sopenharmony_ciint t3_slow_intr_handler(struct adapter *adapter);
67362306a36Sopenharmony_ciint t3_phy_intr_handler(struct adapter *adapter);
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_civoid t3_link_changed(struct adapter *adapter, int port_id);
67662306a36Sopenharmony_civoid t3_link_fault(struct adapter *adapter, int port_id);
67762306a36Sopenharmony_ciint t3_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc);
67862306a36Sopenharmony_ciconst struct adapter_info *t3_get_adapter_info(unsigned int board_id);
67962306a36Sopenharmony_ciint t3_seeprom_wp(struct adapter *adapter, int enable);
68062306a36Sopenharmony_ciint t3_get_tp_version(struct adapter *adapter, u32 *vers);
68162306a36Sopenharmony_ciint t3_check_tpsram_version(struct adapter *adapter);
68262306a36Sopenharmony_ciint t3_check_tpsram(struct adapter *adapter, const u8 *tp_ram,
68362306a36Sopenharmony_ci		    unsigned int size);
68462306a36Sopenharmony_ciint t3_set_proto_sram(struct adapter *adap, const u8 *data);
68562306a36Sopenharmony_ciint t3_load_fw(struct adapter *adapter, const u8 * fw_data, unsigned int size);
68662306a36Sopenharmony_ciint t3_get_fw_version(struct adapter *adapter, u32 *vers);
68762306a36Sopenharmony_ciint t3_check_fw_version(struct adapter *adapter);
68862306a36Sopenharmony_ciint t3_init_hw(struct adapter *adapter, u32 fw_params);
68962306a36Sopenharmony_ciint t3_reset_adapter(struct adapter *adapter);
69062306a36Sopenharmony_ciint t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
69162306a36Sopenharmony_ci		    int reset);
69262306a36Sopenharmony_ciint t3_replay_prep_adapter(struct adapter *adapter);
69362306a36Sopenharmony_civoid t3_led_ready(struct adapter *adapter);
69462306a36Sopenharmony_civoid t3_fatal_err(struct adapter *adapter);
69562306a36Sopenharmony_civoid t3_set_vlan_accel(struct adapter *adapter, unsigned int ports, int on);
69662306a36Sopenharmony_civoid t3_config_rss(struct adapter *adapter, unsigned int rss_config,
69762306a36Sopenharmony_ci		   const u8 * cpus, const u16 *rspq);
69862306a36Sopenharmony_ciint t3_cim_ctl_blk_read(struct adapter *adap, unsigned int addr,
69962306a36Sopenharmony_ci			unsigned int n, unsigned int *valp);
70062306a36Sopenharmony_ciint t3_mc7_bd_read(struct mc7 *mc7, unsigned int start, unsigned int n,
70162306a36Sopenharmony_ci		   u64 *buf);
70262306a36Sopenharmony_ci
70362306a36Sopenharmony_ciint t3_mac_reset(struct cmac *mac);
70462306a36Sopenharmony_civoid t3b_pcs_reset(struct cmac *mac);
70562306a36Sopenharmony_civoid t3_mac_disable_exact_filters(struct cmac *mac);
70662306a36Sopenharmony_civoid t3_mac_enable_exact_filters(struct cmac *mac);
70762306a36Sopenharmony_ciint t3_mac_enable(struct cmac *mac, int which);
70862306a36Sopenharmony_ciint t3_mac_disable(struct cmac *mac, int which);
70962306a36Sopenharmony_ciint t3_mac_set_mtu(struct cmac *mac, unsigned int mtu);
71062306a36Sopenharmony_ciint t3_mac_set_rx_mode(struct cmac *mac, struct net_device *dev);
71162306a36Sopenharmony_ciint t3_mac_set_address(struct cmac *mac, unsigned int idx, const u8 addr[6]);
71262306a36Sopenharmony_ciint t3_mac_set_num_ucast(struct cmac *mac, int n);
71362306a36Sopenharmony_ciconst struct mac_stats *t3_mac_update_stats(struct cmac *mac);
71462306a36Sopenharmony_ciint t3_mac_set_speed_duplex_fc(struct cmac *mac, int speed, int duplex, int fc);
71562306a36Sopenharmony_ciint t3b2_mac_watchdog_task(struct cmac *mac);
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_civoid t3_mc5_prep(struct adapter *adapter, struct mc5 *mc5, int mode);
71862306a36Sopenharmony_ciint t3_mc5_init(struct mc5 *mc5, unsigned int nservers, unsigned int nfilters,
71962306a36Sopenharmony_ci		unsigned int nroutes);
72062306a36Sopenharmony_civoid t3_mc5_intr_handler(struct mc5 *mc5);
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_civoid t3_tp_set_offload_mode(struct adapter *adap, int enable);
72362306a36Sopenharmony_civoid t3_tp_get_mib_stats(struct adapter *adap, struct tp_mib_stats *tps);
72462306a36Sopenharmony_civoid t3_load_mtus(struct adapter *adap, unsigned short mtus[NMTUS],
72562306a36Sopenharmony_ci		  unsigned short alpha[NCCTRL_WIN],
72662306a36Sopenharmony_ci		  unsigned short beta[NCCTRL_WIN], unsigned short mtu_cap);
72762306a36Sopenharmony_civoid t3_config_trace_filter(struct adapter *adapter,
72862306a36Sopenharmony_ci			    const struct trace_params *tp, int filter_index,
72962306a36Sopenharmony_ci			    int invert, int enable);
73062306a36Sopenharmony_ciint t3_config_sched(struct adapter *adap, unsigned int kbps, int sched);
73162306a36Sopenharmony_ci
73262306a36Sopenharmony_civoid t3_sge_prep(struct adapter *adap, struct sge_params *p);
73362306a36Sopenharmony_civoid t3_sge_init(struct adapter *adap, struct sge_params *p);
73462306a36Sopenharmony_ciint t3_sge_init_ecntxt(struct adapter *adapter, unsigned int id, int gts_enable,
73562306a36Sopenharmony_ci		       enum sge_context_type type, int respq, u64 base_addr,
73662306a36Sopenharmony_ci		       unsigned int size, unsigned int token, int gen,
73762306a36Sopenharmony_ci		       unsigned int cidx);
73862306a36Sopenharmony_ciint t3_sge_init_flcntxt(struct adapter *adapter, unsigned int id,
73962306a36Sopenharmony_ci			int gts_enable, u64 base_addr, unsigned int size,
74062306a36Sopenharmony_ci			unsigned int esize, unsigned int cong_thres, int gen,
74162306a36Sopenharmony_ci			unsigned int cidx);
74262306a36Sopenharmony_ciint t3_sge_init_rspcntxt(struct adapter *adapter, unsigned int id,
74362306a36Sopenharmony_ci			 int irq_vec_idx, u64 base_addr, unsigned int size,
74462306a36Sopenharmony_ci			 unsigned int fl_thres, int gen, unsigned int cidx);
74562306a36Sopenharmony_ciint t3_sge_init_cqcntxt(struct adapter *adapter, unsigned int id, u64 base_addr,
74662306a36Sopenharmony_ci			unsigned int size, int rspq, int ovfl_mode,
74762306a36Sopenharmony_ci			unsigned int credits, unsigned int credit_thres);
74862306a36Sopenharmony_ciint t3_sge_enable_ecntxt(struct adapter *adapter, unsigned int id, int enable);
74962306a36Sopenharmony_ciint t3_sge_disable_fl(struct adapter *adapter, unsigned int id);
75062306a36Sopenharmony_ciint t3_sge_disable_rspcntxt(struct adapter *adapter, unsigned int id);
75162306a36Sopenharmony_ciint t3_sge_disable_cqcntxt(struct adapter *adapter, unsigned int id);
75262306a36Sopenharmony_ciint t3_sge_cqcntxt_op(struct adapter *adapter, unsigned int id, unsigned int op,
75362306a36Sopenharmony_ci		      unsigned int credits);
75462306a36Sopenharmony_ci
75562306a36Sopenharmony_ciint t3_vsc8211_phy_prep(struct cphy *phy, struct adapter *adapter,
75662306a36Sopenharmony_ci			int phy_addr, const struct mdio_ops *mdio_ops);
75762306a36Sopenharmony_ciint t3_ael1002_phy_prep(struct cphy *phy, struct adapter *adapter,
75862306a36Sopenharmony_ci			int phy_addr, const struct mdio_ops *mdio_ops);
75962306a36Sopenharmony_ciint t3_ael1006_phy_prep(struct cphy *phy, struct adapter *adapter,
76062306a36Sopenharmony_ci			int phy_addr, const struct mdio_ops *mdio_ops);
76162306a36Sopenharmony_ciint t3_ael2005_phy_prep(struct cphy *phy, struct adapter *adapter,
76262306a36Sopenharmony_ci			int phy_addr, const struct mdio_ops *mdio_ops);
76362306a36Sopenharmony_ciint t3_ael2020_phy_prep(struct cphy *phy, struct adapter *adapter,
76462306a36Sopenharmony_ci			int phy_addr, const struct mdio_ops *mdio_ops);
76562306a36Sopenharmony_ciint t3_qt2045_phy_prep(struct cphy *phy, struct adapter *adapter, int phy_addr,
76662306a36Sopenharmony_ci		       const struct mdio_ops *mdio_ops);
76762306a36Sopenharmony_ciint t3_xaui_direct_phy_prep(struct cphy *phy, struct adapter *adapter,
76862306a36Sopenharmony_ci			    int phy_addr, const struct mdio_ops *mdio_ops);
76962306a36Sopenharmony_ciint t3_aq100x_phy_prep(struct cphy *phy, struct adapter *adapter,
77062306a36Sopenharmony_ci			    int phy_addr, const struct mdio_ops *mdio_ops);
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_ciextern struct workqueue_struct *cxgb3_wq;
77362306a36Sopenharmony_ci#endif				/* __CHELSIO_COMMON_H */
774