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