162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/***************************************************************************** 362306a36Sopenharmony_ci * * 462306a36Sopenharmony_ci * File: common.h * 562306a36Sopenharmony_ci * $Revision: 1.21 $ * 662306a36Sopenharmony_ci * $Date: 2005/06/22 00:43:25 $ * 762306a36Sopenharmony_ci * Description: * 862306a36Sopenharmony_ci * part of the Chelsio 10Gb Ethernet Driver. * 962306a36Sopenharmony_ci * * 1062306a36Sopenharmony_ci * * 1162306a36Sopenharmony_ci * http://www.chelsio.com * 1262306a36Sopenharmony_ci * * 1362306a36Sopenharmony_ci * Copyright (c) 2003 - 2005 Chelsio Communications, Inc. * 1462306a36Sopenharmony_ci * All rights reserved. * 1562306a36Sopenharmony_ci * * 1662306a36Sopenharmony_ci * Maintainers: maintainers@chelsio.com * 1762306a36Sopenharmony_ci * * 1862306a36Sopenharmony_ci * Authors: Dimitrios Michailidis <dm@chelsio.com> * 1962306a36Sopenharmony_ci * Tina Yang <tainay@chelsio.com> * 2062306a36Sopenharmony_ci * Felix Marti <felix@chelsio.com> * 2162306a36Sopenharmony_ci * Scott Bardone <sbardone@chelsio.com> * 2262306a36Sopenharmony_ci * Kurt Ottaway <kottaway@chelsio.com> * 2362306a36Sopenharmony_ci * Frank DiMambro <frank@chelsio.com> * 2462306a36Sopenharmony_ci * * 2562306a36Sopenharmony_ci * History: * 2662306a36Sopenharmony_ci * * 2762306a36Sopenharmony_ci ****************************************************************************/ 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define pr_fmt(fmt) "cxgb: " fmt 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#ifndef _CXGB_COMMON_H_ 3262306a36Sopenharmony_ci#define _CXGB_COMMON_H_ 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#include <linux/module.h> 3562306a36Sopenharmony_ci#include <linux/netdevice.h> 3662306a36Sopenharmony_ci#include <linux/types.h> 3762306a36Sopenharmony_ci#include <linux/delay.h> 3862306a36Sopenharmony_ci#include <linux/pci.h> 3962306a36Sopenharmony_ci#include <linux/ethtool.h> 4062306a36Sopenharmony_ci#include <linux/if_vlan.h> 4162306a36Sopenharmony_ci#include <linux/mdio.h> 4262306a36Sopenharmony_ci#include <linux/crc32.h> 4362306a36Sopenharmony_ci#include <linux/slab.h> 4462306a36Sopenharmony_ci#include <asm/io.h> 4562306a36Sopenharmony_ci#include <linux/pci_ids.h> 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define DRV_DESCRIPTION "Chelsio 10Gb Ethernet Driver" 4862306a36Sopenharmony_ci#define DRV_NAME "cxgb" 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define CH_DEVICE(devid, ssid, idx) \ 5162306a36Sopenharmony_ci { PCI_VENDOR_ID_CHELSIO, devid, PCI_ANY_ID, ssid, 0, 0, idx } 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define SUPPORTED_PAUSE (1 << 13) 5462306a36Sopenharmony_ci#define SUPPORTED_LOOPBACK (1 << 15) 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define ADVERTISED_PAUSE (1 << 13) 5762306a36Sopenharmony_ci#define ADVERTISED_ASYM_PAUSE (1 << 14) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_citypedef struct adapter adapter_t; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistruct t1_rx_mode { 6262306a36Sopenharmony_ci struct net_device *dev; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci#define t1_rx_mode_promisc(rm) (rm->dev->flags & IFF_PROMISC) 6662306a36Sopenharmony_ci#define t1_rx_mode_allmulti(rm) (rm->dev->flags & IFF_ALLMULTI) 6762306a36Sopenharmony_ci#define t1_rx_mode_mc_cnt(rm) (netdev_mc_count(rm->dev)) 6862306a36Sopenharmony_ci#define t1_get_netdev(rm) (rm->dev) 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define MAX_NPORTS 4 7162306a36Sopenharmony_ci#define PORT_MASK ((1 << MAX_NPORTS) - 1) 7262306a36Sopenharmony_ci#define NMTUS 8 7362306a36Sopenharmony_ci#define TCB_SIZE 128 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define SPEED_INVALID 0xffff 7662306a36Sopenharmony_ci#define DUPLEX_INVALID 0xff 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/* Max frame size PM3393 can handle. Includes Ethernet header and CRC. */ 7962306a36Sopenharmony_ci#define PM3393_MAX_FRAME_SIZE 9600 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define VSC7326_MAX_MTU 9600 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cienum { 8462306a36Sopenharmony_ci CHBT_BOARD_N110, 8562306a36Sopenharmony_ci CHBT_BOARD_N210, 8662306a36Sopenharmony_ci CHBT_BOARD_7500, 8762306a36Sopenharmony_ci CHBT_BOARD_8000, 8862306a36Sopenharmony_ci CHBT_BOARD_CHT101, 8962306a36Sopenharmony_ci CHBT_BOARD_CHT110, 9062306a36Sopenharmony_ci CHBT_BOARD_CHT210, 9162306a36Sopenharmony_ci CHBT_BOARD_CHT204, 9262306a36Sopenharmony_ci CHBT_BOARD_CHT204V, 9362306a36Sopenharmony_ci CHBT_BOARD_CHT204E, 9462306a36Sopenharmony_ci CHBT_BOARD_CHN204, 9562306a36Sopenharmony_ci CHBT_BOARD_COUGAR, 9662306a36Sopenharmony_ci CHBT_BOARD_6800, 9762306a36Sopenharmony_ci CHBT_BOARD_SIMUL, 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cienum { 10162306a36Sopenharmony_ci CHBT_TERM_FPGA, 10262306a36Sopenharmony_ci CHBT_TERM_T1, 10362306a36Sopenharmony_ci CHBT_TERM_T2, 10462306a36Sopenharmony_ci CHBT_TERM_T3 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cienum { 10862306a36Sopenharmony_ci CHBT_MAC_CHELSIO_A, 10962306a36Sopenharmony_ci CHBT_MAC_IXF1010, 11062306a36Sopenharmony_ci CHBT_MAC_PM3393, 11162306a36Sopenharmony_ci CHBT_MAC_VSC7321, 11262306a36Sopenharmony_ci CHBT_MAC_DUMMY 11362306a36Sopenharmony_ci}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cienum { 11662306a36Sopenharmony_ci CHBT_PHY_88E1041, 11762306a36Sopenharmony_ci CHBT_PHY_88E1111, 11862306a36Sopenharmony_ci CHBT_PHY_88X2010, 11962306a36Sopenharmony_ci CHBT_PHY_XPAK, 12062306a36Sopenharmony_ci CHBT_PHY_MY3126, 12162306a36Sopenharmony_ci CHBT_PHY_8244, 12262306a36Sopenharmony_ci CHBT_PHY_DUMMY 12362306a36Sopenharmony_ci}; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cienum { 12662306a36Sopenharmony_ci PAUSE_RX = 1 << 0, 12762306a36Sopenharmony_ci PAUSE_TX = 1 << 1, 12862306a36Sopenharmony_ci PAUSE_AUTONEG = 1 << 2 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/* Revisions of T1 chip */ 13262306a36Sopenharmony_cienum { 13362306a36Sopenharmony_ci TERM_T1A = 0, 13462306a36Sopenharmony_ci TERM_T1B = 1, 13562306a36Sopenharmony_ci TERM_T2 = 3 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cistruct sge_params { 13962306a36Sopenharmony_ci unsigned int cmdQ_size[2]; 14062306a36Sopenharmony_ci unsigned int freelQ_size[2]; 14162306a36Sopenharmony_ci unsigned int large_buf_capacity; 14262306a36Sopenharmony_ci unsigned int rx_coalesce_usecs; 14362306a36Sopenharmony_ci unsigned int last_rx_coalesce_raw; 14462306a36Sopenharmony_ci unsigned int default_rx_coalesce_usecs; 14562306a36Sopenharmony_ci unsigned int sample_interval_usecs; 14662306a36Sopenharmony_ci unsigned int coalesce_enable; 14762306a36Sopenharmony_ci unsigned int polling; 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistruct chelsio_pci_params { 15162306a36Sopenharmony_ci unsigned short speed; 15262306a36Sopenharmony_ci unsigned char width; 15362306a36Sopenharmony_ci unsigned char is_pcix; 15462306a36Sopenharmony_ci}; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistruct tp_params { 15762306a36Sopenharmony_ci unsigned int pm_size; 15862306a36Sopenharmony_ci unsigned int cm_size; 15962306a36Sopenharmony_ci unsigned int pm_rx_base; 16062306a36Sopenharmony_ci unsigned int pm_tx_base; 16162306a36Sopenharmony_ci unsigned int pm_rx_pg_size; 16262306a36Sopenharmony_ci unsigned int pm_tx_pg_size; 16362306a36Sopenharmony_ci unsigned int pm_rx_num_pgs; 16462306a36Sopenharmony_ci unsigned int pm_tx_num_pgs; 16562306a36Sopenharmony_ci unsigned int rx_coalescing_size; 16662306a36Sopenharmony_ci unsigned int use_5tuple_mode; 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistruct mc5_params { 17062306a36Sopenharmony_ci unsigned int mode; /* selects MC5 width */ 17162306a36Sopenharmony_ci unsigned int nservers; /* size of server region */ 17262306a36Sopenharmony_ci unsigned int nroutes; /* size of routing region */ 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci/* Default MC5 region sizes */ 17662306a36Sopenharmony_ci#define DEFAULT_SERVER_REGION_LEN 256 17762306a36Sopenharmony_ci#define DEFAULT_RT_REGION_LEN 1024 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistruct adapter_params { 18062306a36Sopenharmony_ci struct sge_params sge; 18162306a36Sopenharmony_ci struct mc5_params mc5; 18262306a36Sopenharmony_ci struct tp_params tp; 18362306a36Sopenharmony_ci struct chelsio_pci_params pci; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci const struct board_info *brd_info; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci unsigned short mtus[NMTUS]; 18862306a36Sopenharmony_ci unsigned int nports; /* # of ethernet ports */ 18962306a36Sopenharmony_ci unsigned int stats_update_period; 19062306a36Sopenharmony_ci unsigned short chip_revision; 19162306a36Sopenharmony_ci unsigned char chip_version; 19262306a36Sopenharmony_ci unsigned char is_asic; 19362306a36Sopenharmony_ci unsigned char has_msi; 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistruct link_config { 19762306a36Sopenharmony_ci unsigned int supported; /* link capabilities */ 19862306a36Sopenharmony_ci unsigned int advertising; /* advertised capabilities */ 19962306a36Sopenharmony_ci unsigned short requested_speed; /* speed user has requested */ 20062306a36Sopenharmony_ci unsigned short speed; /* actual link speed */ 20162306a36Sopenharmony_ci unsigned char requested_duplex; /* duplex user has requested */ 20262306a36Sopenharmony_ci unsigned char duplex; /* actual link duplex */ 20362306a36Sopenharmony_ci unsigned char requested_fc; /* flow control user has requested */ 20462306a36Sopenharmony_ci unsigned char fc; /* actual link flow control */ 20562306a36Sopenharmony_ci unsigned char autoneg; /* autonegotiating? */ 20662306a36Sopenharmony_ci}; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_cistruct cmac; 20962306a36Sopenharmony_cistruct cphy; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistruct port_info { 21262306a36Sopenharmony_ci struct net_device *dev; 21362306a36Sopenharmony_ci struct cmac *mac; 21462306a36Sopenharmony_ci struct cphy *phy; 21562306a36Sopenharmony_ci struct link_config link_config; 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_cistruct sge; 21962306a36Sopenharmony_cistruct peespi; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistruct adapter { 22262306a36Sopenharmony_ci u8 __iomem *regs; 22362306a36Sopenharmony_ci struct pci_dev *pdev; 22462306a36Sopenharmony_ci unsigned long registered_device_map; 22562306a36Sopenharmony_ci unsigned long open_device_map; 22662306a36Sopenharmony_ci unsigned long flags; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci const char *name; 22962306a36Sopenharmony_ci int msg_enable; 23062306a36Sopenharmony_ci u32 mmio_len; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci struct adapter_params params; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci /* Terminator modules. */ 23562306a36Sopenharmony_ci struct sge *sge; 23662306a36Sopenharmony_ci struct peespi *espi; 23762306a36Sopenharmony_ci struct petp *tp; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci struct napi_struct napi; 24062306a36Sopenharmony_ci struct port_info port[MAX_NPORTS]; 24162306a36Sopenharmony_ci struct delayed_work stats_update_task; 24262306a36Sopenharmony_ci struct timer_list stats_update_timer; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci spinlock_t tpi_lock; 24562306a36Sopenharmony_ci spinlock_t work_lock; 24662306a36Sopenharmony_ci spinlock_t mac_lock; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci /* guards async operations */ 24962306a36Sopenharmony_ci spinlock_t async_lock ____cacheline_aligned; 25062306a36Sopenharmony_ci u32 pending_thread_intr; 25162306a36Sopenharmony_ci u32 slow_intr_mask; 25262306a36Sopenharmony_ci int t1powersave; 25362306a36Sopenharmony_ci}; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cienum { /* adapter flags */ 25662306a36Sopenharmony_ci FULL_INIT_DONE = 1 << 0, 25762306a36Sopenharmony_ci}; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cistruct mdio_ops; 26062306a36Sopenharmony_cistruct gmac; 26162306a36Sopenharmony_cistruct gphy; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistruct board_info { 26462306a36Sopenharmony_ci unsigned char board; 26562306a36Sopenharmony_ci unsigned char port_number; 26662306a36Sopenharmony_ci unsigned long caps; 26762306a36Sopenharmony_ci unsigned char chip_term; 26862306a36Sopenharmony_ci unsigned char chip_mac; 26962306a36Sopenharmony_ci unsigned char chip_phy; 27062306a36Sopenharmony_ci unsigned int clock_core; 27162306a36Sopenharmony_ci unsigned int clock_mc3; 27262306a36Sopenharmony_ci unsigned int clock_mc4; 27362306a36Sopenharmony_ci unsigned int espi_nports; 27462306a36Sopenharmony_ci unsigned int clock_elmer0; 27562306a36Sopenharmony_ci unsigned char mdio_mdien; 27662306a36Sopenharmony_ci unsigned char mdio_mdiinv; 27762306a36Sopenharmony_ci unsigned char mdio_mdc; 27862306a36Sopenharmony_ci unsigned char mdio_phybaseaddr; 27962306a36Sopenharmony_ci const struct gmac *gmac; 28062306a36Sopenharmony_ci const struct gphy *gphy; 28162306a36Sopenharmony_ci const struct mdio_ops *mdio_ops; 28262306a36Sopenharmony_ci const char *desc; 28362306a36Sopenharmony_ci}; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic inline int t1_is_asic(const adapter_t *adapter) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci return adapter->params.is_asic; 28862306a36Sopenharmony_ci} 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ciextern const struct pci_device_id t1_pci_tbl[]; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic inline int adapter_matches_type(const adapter_t *adapter, 29362306a36Sopenharmony_ci int version, int revision) 29462306a36Sopenharmony_ci{ 29562306a36Sopenharmony_ci return adapter->params.chip_version == version && 29662306a36Sopenharmony_ci adapter->params.chip_revision == revision; 29762306a36Sopenharmony_ci} 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci#define t1_is_T1B(adap) adapter_matches_type(adap, CHBT_TERM_T1, TERM_T1B) 30062306a36Sopenharmony_ci#define is_T2(adap) adapter_matches_type(adap, CHBT_TERM_T2, TERM_T2) 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci/* Returns true if an adapter supports VLAN acceleration and TSO */ 30362306a36Sopenharmony_cistatic inline int vlan_tso_capable(const adapter_t *adapter) 30462306a36Sopenharmony_ci{ 30562306a36Sopenharmony_ci return !t1_is_T1B(adapter); 30662306a36Sopenharmony_ci} 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci#define for_each_port(adapter, iter) \ 30962306a36Sopenharmony_ci for (iter = 0; iter < (adapter)->params.nports; ++iter) 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci#define board_info(adapter) ((adapter)->params.brd_info) 31262306a36Sopenharmony_ci#define is_10G(adapter) (board_info(adapter)->caps & SUPPORTED_10000baseT_Full) 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic inline unsigned int core_ticks_per_usec(const adapter_t *adap) 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci return board_info(adap)->clock_core / 1000000; 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ciint __t1_tpi_read(adapter_t *adapter, u32 addr, u32 *valp); 32062306a36Sopenharmony_ciint __t1_tpi_write(adapter_t *adapter, u32 addr, u32 value); 32162306a36Sopenharmony_ciint t1_tpi_write(adapter_t *adapter, u32 addr, u32 value); 32262306a36Sopenharmony_ciint t1_tpi_read(adapter_t *adapter, u32 addr, u32 *value); 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_civoid t1_interrupts_enable(adapter_t *adapter); 32562306a36Sopenharmony_civoid t1_interrupts_disable(adapter_t *adapter); 32662306a36Sopenharmony_civoid t1_interrupts_clear(adapter_t *adapter); 32762306a36Sopenharmony_ciint t1_elmer0_ext_intr_handler(adapter_t *adapter); 32862306a36Sopenharmony_ciirqreturn_t t1_slow_intr_handler(adapter_t *adapter); 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ciint t1_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc); 33162306a36Sopenharmony_ciconst struct board_info *t1_get_board_info(unsigned int board_id); 33262306a36Sopenharmony_ciconst struct board_info *t1_get_board_info_from_ids(unsigned int devid, 33362306a36Sopenharmony_ci unsigned short ssid); 33462306a36Sopenharmony_ciint t1_seeprom_read(adapter_t *adapter, u32 addr, __le32 *data); 33562306a36Sopenharmony_ciint t1_get_board_rev(adapter_t *adapter, const struct board_info *bi, 33662306a36Sopenharmony_ci struct adapter_params *p); 33762306a36Sopenharmony_ciint t1_init_hw_modules(adapter_t *adapter); 33862306a36Sopenharmony_ciint t1_init_sw_modules(adapter_t *adapter, const struct board_info *bi); 33962306a36Sopenharmony_civoid t1_free_sw_modules(adapter_t *adapter); 34062306a36Sopenharmony_civoid t1_link_changed(adapter_t *adapter, int port_id); 34162306a36Sopenharmony_civoid t1_link_negotiated(adapter_t *adapter, int port_id, int link_stat, 34262306a36Sopenharmony_ci int speed, int duplex, int pause); 34362306a36Sopenharmony_ci#endif /* _CXGB_COMMON_H_ */ 344