162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/drivers/net/ethernet/ibm/ehea/ehea.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * eHEA ethernet device driver for IBM eServer System p 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * (C) Copyright IBM Corp. 2006 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Authors: 1062306a36Sopenharmony_ci * Christoph Raisch <raisch@de.ibm.com> 1162306a36Sopenharmony_ci * Jan-Bernd Themann <themann@de.ibm.com> 1262306a36Sopenharmony_ci * Thomas Klein <tklein@de.ibm.com> 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifndef __EHEA_H__ 1662306a36Sopenharmony_ci#define __EHEA_H__ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <linux/module.h> 1962306a36Sopenharmony_ci#include <linux/ethtool.h> 2062306a36Sopenharmony_ci#include <linux/vmalloc.h> 2162306a36Sopenharmony_ci#include <linux/if_vlan.h> 2262306a36Sopenharmony_ci#include <linux/platform_device.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include <asm/ibmebus.h> 2562306a36Sopenharmony_ci#include <asm/io.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define DRV_NAME "ehea" 2862306a36Sopenharmony_ci#define DRV_VERSION "EHEA_0107" 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* eHEA capability flags */ 3162306a36Sopenharmony_ci#define DLPAR_PORT_ADD_REM 1 3262306a36Sopenharmony_ci#define DLPAR_MEM_ADD 2 3362306a36Sopenharmony_ci#define DLPAR_MEM_REM 4 3462306a36Sopenharmony_ci#define EHEA_CAPABILITIES (DLPAR_PORT_ADD_REM | DLPAR_MEM_ADD | DLPAR_MEM_REM) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ 3762306a36Sopenharmony_ci | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define EHEA_MAX_ENTRIES_RQ1 32767 4062306a36Sopenharmony_ci#define EHEA_MAX_ENTRIES_RQ2 16383 4162306a36Sopenharmony_ci#define EHEA_MAX_ENTRIES_RQ3 16383 4262306a36Sopenharmony_ci#define EHEA_MAX_ENTRIES_SQ 32767 4362306a36Sopenharmony_ci#define EHEA_MIN_ENTRIES_QP 127 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define EHEA_SMALL_QUEUES 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#ifdef EHEA_SMALL_QUEUES 4862306a36Sopenharmony_ci#define EHEA_MAX_CQE_COUNT 1023 4962306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_SQ 1023 5062306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_RQ1 1023 5162306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_RQ2 1023 5262306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_RQ3 511 5362306a36Sopenharmony_ci#else 5462306a36Sopenharmony_ci#define EHEA_MAX_CQE_COUNT 4080 5562306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_SQ 4080 5662306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_RQ1 8160 5762306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_RQ2 2040 5862306a36Sopenharmony_ci#define EHEA_DEF_ENTRIES_RQ3 2040 5962306a36Sopenharmony_ci#endif 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#define EHEA_MAX_ENTRIES_EQ 20 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define EHEA_SG_SQ 2 6462306a36Sopenharmony_ci#define EHEA_SG_RQ1 1 6562306a36Sopenharmony_ci#define EHEA_SG_RQ2 0 6662306a36Sopenharmony_ci#define EHEA_SG_RQ3 0 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#define EHEA_MAX_PACKET_SIZE 9022 /* for jumbo frames */ 6962306a36Sopenharmony_ci#define EHEA_RQ2_PKT_SIZE 2048 7062306a36Sopenharmony_ci#define EHEA_L_PKT_SIZE 256 /* low latency */ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* Send completion signaling */ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* Protection Domain Identifier */ 7562306a36Sopenharmony_ci#define EHEA_PD_ID 0xaabcdeff 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define EHEA_RQ2_THRESHOLD 1 7862306a36Sopenharmony_ci#define EHEA_RQ3_THRESHOLD 4 /* use RQ3 threshold of 2048 bytes */ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define EHEA_SPEED_10G 10000 8162306a36Sopenharmony_ci#define EHEA_SPEED_1G 1000 8262306a36Sopenharmony_ci#define EHEA_SPEED_100M 100 8362306a36Sopenharmony_ci#define EHEA_SPEED_10M 10 8462306a36Sopenharmony_ci#define EHEA_SPEED_AUTONEG 0 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/* Broadcast/Multicast registration types */ 8762306a36Sopenharmony_ci#define EHEA_BCMC_SCOPE_ALL 0x08 8862306a36Sopenharmony_ci#define EHEA_BCMC_SCOPE_SINGLE 0x00 8962306a36Sopenharmony_ci#define EHEA_BCMC_MULTICAST 0x04 9062306a36Sopenharmony_ci#define EHEA_BCMC_BROADCAST 0x00 9162306a36Sopenharmony_ci#define EHEA_BCMC_UNTAGGED 0x02 9262306a36Sopenharmony_ci#define EHEA_BCMC_TAGGED 0x00 9362306a36Sopenharmony_ci#define EHEA_BCMC_VLANID_ALL 0x01 9462306a36Sopenharmony_ci#define EHEA_BCMC_VLANID_SINGLE 0x00 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#define EHEA_CACHE_LINE 128 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* Memory Regions */ 9962306a36Sopenharmony_ci#define EHEA_MR_ACC_CTRL 0x00800000 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci#define EHEA_BUSMAP_START 0x8000000000000000ULL 10262306a36Sopenharmony_ci#define EHEA_INVAL_ADDR 0xFFFFFFFFFFFFFFFFULL 10362306a36Sopenharmony_ci#define EHEA_DIR_INDEX_SHIFT 13 /* 8k Entries in 64k block */ 10462306a36Sopenharmony_ci#define EHEA_TOP_INDEX_SHIFT (EHEA_DIR_INDEX_SHIFT * 2) 10562306a36Sopenharmony_ci#define EHEA_MAP_ENTRIES (1 << EHEA_DIR_INDEX_SHIFT) 10662306a36Sopenharmony_ci#define EHEA_MAP_SIZE (0x10000) /* currently fixed map size */ 10762306a36Sopenharmony_ci#define EHEA_INDEX_MASK (EHEA_MAP_ENTRIES - 1) 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define EHEA_WATCH_DOG_TIMEOUT 10*HZ 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* utility functions */ 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_civoid ehea_dump(void *adr, int len, char *msg); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define EHEA_BMASK(pos, length) (((pos) << 16) + (length)) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#define EHEA_BMASK_IBM(from, to) (((63 - to) << 16) + ((to) - (from) + 1)) 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci#define EHEA_BMASK_SHIFTPOS(mask) (((mask) >> 16) & 0xffff) 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#define EHEA_BMASK_MASK(mask) \ 12362306a36Sopenharmony_ci (0xffffffffffffffffULL >> ((64 - (mask)) & 0xffff)) 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci#define EHEA_BMASK_SET(mask, value) \ 12662306a36Sopenharmony_ci ((EHEA_BMASK_MASK(mask) & ((u64)(value))) << EHEA_BMASK_SHIFTPOS(mask)) 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci#define EHEA_BMASK_GET(mask, value) \ 12962306a36Sopenharmony_ci (EHEA_BMASK_MASK(mask) & (((u64)(value)) >> EHEA_BMASK_SHIFTPOS(mask))) 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/* 13262306a36Sopenharmony_ci * Generic ehea page 13362306a36Sopenharmony_ci */ 13462306a36Sopenharmony_cistruct ehea_page { 13562306a36Sopenharmony_ci u8 entries[PAGE_SIZE]; 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/* 13962306a36Sopenharmony_ci * Generic queue in linux kernel virtual memory 14062306a36Sopenharmony_ci */ 14162306a36Sopenharmony_cistruct hw_queue { 14262306a36Sopenharmony_ci u64 current_q_offset; /* current queue entry */ 14362306a36Sopenharmony_ci struct ehea_page **queue_pages; /* array of pages belonging to queue */ 14462306a36Sopenharmony_ci u32 qe_size; /* queue entry size */ 14562306a36Sopenharmony_ci u32 queue_length; /* queue length allocated in bytes */ 14662306a36Sopenharmony_ci u32 pagesize; 14762306a36Sopenharmony_ci u32 toggle_state; /* toggle flag - per page */ 14862306a36Sopenharmony_ci u32 reserved; /* 64 bit alignment */ 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/* 15262306a36Sopenharmony_ci * For pSeries this is a 64bit memory address where 15362306a36Sopenharmony_ci * I/O memory is mapped into CPU address space 15462306a36Sopenharmony_ci */ 15562306a36Sopenharmony_cistruct h_epa { 15662306a36Sopenharmony_ci void __iomem *addr; 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistruct h_epa_user { 16062306a36Sopenharmony_ci u64 addr; 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistruct h_epas { 16462306a36Sopenharmony_ci struct h_epa kernel; /* kernel space accessible resource, 16562306a36Sopenharmony_ci set to 0 if unused */ 16662306a36Sopenharmony_ci struct h_epa_user user; /* user space accessible resource 16762306a36Sopenharmony_ci set to 0 if unused */ 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/* 17162306a36Sopenharmony_ci * Memory map data structures 17262306a36Sopenharmony_ci */ 17362306a36Sopenharmony_cistruct ehea_dir_bmap 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci u64 ent[EHEA_MAP_ENTRIES]; 17662306a36Sopenharmony_ci}; 17762306a36Sopenharmony_cistruct ehea_top_bmap 17862306a36Sopenharmony_ci{ 17962306a36Sopenharmony_ci struct ehea_dir_bmap *dir[EHEA_MAP_ENTRIES]; 18062306a36Sopenharmony_ci}; 18162306a36Sopenharmony_cistruct ehea_bmap 18262306a36Sopenharmony_ci{ 18362306a36Sopenharmony_ci struct ehea_top_bmap *top[EHEA_MAP_ENTRIES]; 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistruct ehea_qp; 18762306a36Sopenharmony_cistruct ehea_cq; 18862306a36Sopenharmony_cistruct ehea_eq; 18962306a36Sopenharmony_cistruct ehea_port; 19062306a36Sopenharmony_cistruct ehea_av; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci/* 19362306a36Sopenharmony_ci * Queue attributes passed to ehea_create_qp() 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_cistruct ehea_qp_init_attr { 19662306a36Sopenharmony_ci /* input parameter */ 19762306a36Sopenharmony_ci u32 qp_token; /* queue token */ 19862306a36Sopenharmony_ci u8 low_lat_rq1; 19962306a36Sopenharmony_ci u8 signalingtype; /* cqe generation flag */ 20062306a36Sopenharmony_ci u8 rq_count; /* num of receive queues */ 20162306a36Sopenharmony_ci u8 eqe_gen; /* eqe generation flag */ 20262306a36Sopenharmony_ci u16 max_nr_send_wqes; /* max number of send wqes */ 20362306a36Sopenharmony_ci u16 max_nr_rwqes_rq1; /* max number of receive wqes */ 20462306a36Sopenharmony_ci u16 max_nr_rwqes_rq2; 20562306a36Sopenharmony_ci u16 max_nr_rwqes_rq3; 20662306a36Sopenharmony_ci u8 wqe_size_enc_sq; 20762306a36Sopenharmony_ci u8 wqe_size_enc_rq1; 20862306a36Sopenharmony_ci u8 wqe_size_enc_rq2; 20962306a36Sopenharmony_ci u8 wqe_size_enc_rq3; 21062306a36Sopenharmony_ci u8 swqe_imm_data_len; /* immediate data length for swqes */ 21162306a36Sopenharmony_ci u16 port_nr; 21262306a36Sopenharmony_ci u16 rq2_threshold; 21362306a36Sopenharmony_ci u16 rq3_threshold; 21462306a36Sopenharmony_ci u64 send_cq_handle; 21562306a36Sopenharmony_ci u64 recv_cq_handle; 21662306a36Sopenharmony_ci u64 aff_eq_handle; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* output parameter */ 21962306a36Sopenharmony_ci u32 qp_nr; 22062306a36Sopenharmony_ci u16 act_nr_send_wqes; 22162306a36Sopenharmony_ci u16 act_nr_rwqes_rq1; 22262306a36Sopenharmony_ci u16 act_nr_rwqes_rq2; 22362306a36Sopenharmony_ci u16 act_nr_rwqes_rq3; 22462306a36Sopenharmony_ci u8 act_wqe_size_enc_sq; 22562306a36Sopenharmony_ci u8 act_wqe_size_enc_rq1; 22662306a36Sopenharmony_ci u8 act_wqe_size_enc_rq2; 22762306a36Sopenharmony_ci u8 act_wqe_size_enc_rq3; 22862306a36Sopenharmony_ci u32 nr_sq_pages; 22962306a36Sopenharmony_ci u32 nr_rq1_pages; 23062306a36Sopenharmony_ci u32 nr_rq2_pages; 23162306a36Sopenharmony_ci u32 nr_rq3_pages; 23262306a36Sopenharmony_ci u32 liobn_sq; 23362306a36Sopenharmony_ci u32 liobn_rq1; 23462306a36Sopenharmony_ci u32 liobn_rq2; 23562306a36Sopenharmony_ci u32 liobn_rq3; 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/* 23962306a36Sopenharmony_ci * Event Queue attributes, passed as parameter 24062306a36Sopenharmony_ci */ 24162306a36Sopenharmony_cistruct ehea_eq_attr { 24262306a36Sopenharmony_ci u32 type; 24362306a36Sopenharmony_ci u32 max_nr_of_eqes; 24462306a36Sopenharmony_ci u8 eqe_gen; /* generate eqe flag */ 24562306a36Sopenharmony_ci u64 eq_handle; 24662306a36Sopenharmony_ci u32 act_nr_of_eqes; 24762306a36Sopenharmony_ci u32 nr_pages; 24862306a36Sopenharmony_ci u32 ist1; /* Interrupt service token */ 24962306a36Sopenharmony_ci u32 ist2; 25062306a36Sopenharmony_ci u32 ist3; 25162306a36Sopenharmony_ci u32 ist4; 25262306a36Sopenharmony_ci}; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci/* 25662306a36Sopenharmony_ci * Event Queue 25762306a36Sopenharmony_ci */ 25862306a36Sopenharmony_cistruct ehea_eq { 25962306a36Sopenharmony_ci struct ehea_adapter *adapter; 26062306a36Sopenharmony_ci struct hw_queue hw_queue; 26162306a36Sopenharmony_ci u64 fw_handle; 26262306a36Sopenharmony_ci struct h_epas epas; 26362306a36Sopenharmony_ci spinlock_t spinlock; 26462306a36Sopenharmony_ci struct ehea_eq_attr attr; 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci/* 26862306a36Sopenharmony_ci * HEA Queues 26962306a36Sopenharmony_ci */ 27062306a36Sopenharmony_cistruct ehea_qp { 27162306a36Sopenharmony_ci struct ehea_adapter *adapter; 27262306a36Sopenharmony_ci u64 fw_handle; /* QP handle for firmware calls */ 27362306a36Sopenharmony_ci struct hw_queue hw_squeue; 27462306a36Sopenharmony_ci struct hw_queue hw_rqueue1; 27562306a36Sopenharmony_ci struct hw_queue hw_rqueue2; 27662306a36Sopenharmony_ci struct hw_queue hw_rqueue3; 27762306a36Sopenharmony_ci struct h_epas epas; 27862306a36Sopenharmony_ci struct ehea_qp_init_attr init_attr; 27962306a36Sopenharmony_ci}; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci/* 28262306a36Sopenharmony_ci * Completion Queue attributes 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_cistruct ehea_cq_attr { 28562306a36Sopenharmony_ci /* input parameter */ 28662306a36Sopenharmony_ci u32 max_nr_of_cqes; 28762306a36Sopenharmony_ci u32 cq_token; 28862306a36Sopenharmony_ci u64 eq_handle; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci /* output parameter */ 29162306a36Sopenharmony_ci u32 act_nr_of_cqes; 29262306a36Sopenharmony_ci u32 nr_pages; 29362306a36Sopenharmony_ci}; 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci/* 29662306a36Sopenharmony_ci * Completion Queue 29762306a36Sopenharmony_ci */ 29862306a36Sopenharmony_cistruct ehea_cq { 29962306a36Sopenharmony_ci struct ehea_adapter *adapter; 30062306a36Sopenharmony_ci u64 fw_handle; 30162306a36Sopenharmony_ci struct hw_queue hw_queue; 30262306a36Sopenharmony_ci struct h_epas epas; 30362306a36Sopenharmony_ci struct ehea_cq_attr attr; 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci/* 30762306a36Sopenharmony_ci * Memory Region 30862306a36Sopenharmony_ci */ 30962306a36Sopenharmony_cistruct ehea_mr { 31062306a36Sopenharmony_ci struct ehea_adapter *adapter; 31162306a36Sopenharmony_ci u64 handle; 31262306a36Sopenharmony_ci u64 vaddr; 31362306a36Sopenharmony_ci u32 lkey; 31462306a36Sopenharmony_ci}; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci/* 31762306a36Sopenharmony_ci * Port state information 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_cistruct port_stats { 32062306a36Sopenharmony_ci int poll_receive_errors; 32162306a36Sopenharmony_ci int queue_stopped; 32262306a36Sopenharmony_ci int err_tcp_cksum; 32362306a36Sopenharmony_ci int err_ip_cksum; 32462306a36Sopenharmony_ci int err_frame_crc; 32562306a36Sopenharmony_ci}; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci#define EHEA_IRQ_NAME_SIZE 20 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci/* 33062306a36Sopenharmony_ci * Queue SKB Array 33162306a36Sopenharmony_ci */ 33262306a36Sopenharmony_cistruct ehea_q_skb_arr { 33362306a36Sopenharmony_ci struct sk_buff **arr; /* skb array for queue */ 33462306a36Sopenharmony_ci int len; /* array length */ 33562306a36Sopenharmony_ci int index; /* array index */ 33662306a36Sopenharmony_ci int os_skbs; /* rq2/rq3 only: outstanding skbs */ 33762306a36Sopenharmony_ci}; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci/* 34062306a36Sopenharmony_ci * Port resources 34162306a36Sopenharmony_ci */ 34262306a36Sopenharmony_cistruct ehea_port_res { 34362306a36Sopenharmony_ci struct napi_struct napi; 34462306a36Sopenharmony_ci struct port_stats p_stats; 34562306a36Sopenharmony_ci struct ehea_mr send_mr; /* send memory region */ 34662306a36Sopenharmony_ci struct ehea_mr recv_mr; /* receive memory region */ 34762306a36Sopenharmony_ci struct ehea_port *port; 34862306a36Sopenharmony_ci char int_recv_name[EHEA_IRQ_NAME_SIZE]; 34962306a36Sopenharmony_ci char int_send_name[EHEA_IRQ_NAME_SIZE]; 35062306a36Sopenharmony_ci struct ehea_qp *qp; 35162306a36Sopenharmony_ci struct ehea_cq *send_cq; 35262306a36Sopenharmony_ci struct ehea_cq *recv_cq; 35362306a36Sopenharmony_ci struct ehea_eq *eq; 35462306a36Sopenharmony_ci struct ehea_q_skb_arr rq1_skba; 35562306a36Sopenharmony_ci struct ehea_q_skb_arr rq2_skba; 35662306a36Sopenharmony_ci struct ehea_q_skb_arr rq3_skba; 35762306a36Sopenharmony_ci struct ehea_q_skb_arr sq_skba; 35862306a36Sopenharmony_ci int sq_skba_size; 35962306a36Sopenharmony_ci int swqe_refill_th; 36062306a36Sopenharmony_ci atomic_t swqe_avail; 36162306a36Sopenharmony_ci int swqe_ll_count; 36262306a36Sopenharmony_ci u32 swqe_id_counter; 36362306a36Sopenharmony_ci u64 tx_packets; 36462306a36Sopenharmony_ci u64 tx_bytes; 36562306a36Sopenharmony_ci u64 rx_packets; 36662306a36Sopenharmony_ci u64 rx_bytes; 36762306a36Sopenharmony_ci int sq_restart_flag; 36862306a36Sopenharmony_ci}; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci#define EHEA_MAX_PORTS 16 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci#define EHEA_NUM_PORTRES_FW_HANDLES 6 /* QP handle, SendCQ handle, 37462306a36Sopenharmony_ci RecvCQ handle, EQ handle, 37562306a36Sopenharmony_ci SendMR handle, RecvMR handle */ 37662306a36Sopenharmony_ci#define EHEA_NUM_PORT_FW_HANDLES 1 /* EQ handle */ 37762306a36Sopenharmony_ci#define EHEA_NUM_ADAPTER_FW_HANDLES 2 /* MR handle, NEQ handle */ 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistruct ehea_adapter { 38062306a36Sopenharmony_ci u64 handle; 38162306a36Sopenharmony_ci struct platform_device *ofdev; 38262306a36Sopenharmony_ci struct ehea_port *port[EHEA_MAX_PORTS]; 38362306a36Sopenharmony_ci struct ehea_eq *neq; /* notification event queue */ 38462306a36Sopenharmony_ci struct tasklet_struct neq_tasklet; 38562306a36Sopenharmony_ci struct ehea_mr mr; 38662306a36Sopenharmony_ci u32 pd; /* protection domain */ 38762306a36Sopenharmony_ci u64 max_mc_mac; /* max number of multicast mac addresses */ 38862306a36Sopenharmony_ci int active_ports; 38962306a36Sopenharmony_ci struct list_head list; 39062306a36Sopenharmony_ci}; 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistruct ehea_mc_list { 39462306a36Sopenharmony_ci struct list_head list; 39562306a36Sopenharmony_ci u64 macaddr; 39662306a36Sopenharmony_ci}; 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci/* kdump support */ 39962306a36Sopenharmony_cistruct ehea_fw_handle_entry { 40062306a36Sopenharmony_ci u64 adh; /* Adapter Handle */ 40162306a36Sopenharmony_ci u64 fwh; /* Firmware Handle */ 40262306a36Sopenharmony_ci}; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cistruct ehea_fw_handle_array { 40562306a36Sopenharmony_ci struct ehea_fw_handle_entry *arr; 40662306a36Sopenharmony_ci int num_entries; 40762306a36Sopenharmony_ci struct mutex lock; 40862306a36Sopenharmony_ci}; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_cistruct ehea_bcmc_reg_entry { 41162306a36Sopenharmony_ci u64 adh; /* Adapter Handle */ 41262306a36Sopenharmony_ci u32 port_id; /* Logical Port Id */ 41362306a36Sopenharmony_ci u8 reg_type; /* Registration Type */ 41462306a36Sopenharmony_ci u64 macaddr; 41562306a36Sopenharmony_ci}; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_cistruct ehea_bcmc_reg_array { 41862306a36Sopenharmony_ci struct ehea_bcmc_reg_entry *arr; 41962306a36Sopenharmony_ci int num_entries; 42062306a36Sopenharmony_ci spinlock_t lock; 42162306a36Sopenharmony_ci}; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci#define EHEA_PORT_UP 1 42462306a36Sopenharmony_ci#define EHEA_PORT_DOWN 0 42562306a36Sopenharmony_ci#define EHEA_PHY_LINK_UP 1 42662306a36Sopenharmony_ci#define EHEA_PHY_LINK_DOWN 0 42762306a36Sopenharmony_ci#define EHEA_MAX_PORT_RES 16 42862306a36Sopenharmony_cistruct ehea_port { 42962306a36Sopenharmony_ci struct ehea_adapter *adapter; /* adapter that owns this port */ 43062306a36Sopenharmony_ci struct net_device *netdev; 43162306a36Sopenharmony_ci struct rtnl_link_stats64 stats; 43262306a36Sopenharmony_ci struct ehea_port_res port_res[EHEA_MAX_PORT_RES]; 43362306a36Sopenharmony_ci struct platform_device ofdev; /* Open Firmware Device */ 43462306a36Sopenharmony_ci struct ehea_mc_list *mc_list; /* Multicast MAC addresses */ 43562306a36Sopenharmony_ci struct ehea_eq *qp_eq; 43662306a36Sopenharmony_ci struct work_struct reset_task; 43762306a36Sopenharmony_ci struct delayed_work stats_work; 43862306a36Sopenharmony_ci struct mutex port_lock; 43962306a36Sopenharmony_ci char int_aff_name[EHEA_IRQ_NAME_SIZE]; 44062306a36Sopenharmony_ci int allmulti; /* Indicates IFF_ALLMULTI state */ 44162306a36Sopenharmony_ci int promisc; /* Indicates IFF_PROMISC state */ 44262306a36Sopenharmony_ci int num_mcs; 44362306a36Sopenharmony_ci int resets; 44462306a36Sopenharmony_ci unsigned long flags; 44562306a36Sopenharmony_ci u64 mac_addr; 44662306a36Sopenharmony_ci u32 logical_port_id; 44762306a36Sopenharmony_ci u32 port_speed; 44862306a36Sopenharmony_ci u32 msg_enable; 44962306a36Sopenharmony_ci u32 sig_comp_iv; 45062306a36Sopenharmony_ci u32 state; 45162306a36Sopenharmony_ci u8 phy_link; 45262306a36Sopenharmony_ci u8 full_duplex; 45362306a36Sopenharmony_ci u8 autoneg; 45462306a36Sopenharmony_ci u8 num_def_qps; 45562306a36Sopenharmony_ci wait_queue_head_t swqe_avail_wq; 45662306a36Sopenharmony_ci wait_queue_head_t restart_wq; 45762306a36Sopenharmony_ci}; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistruct port_res_cfg { 46062306a36Sopenharmony_ci int max_entries_rcq; 46162306a36Sopenharmony_ci int max_entries_scq; 46262306a36Sopenharmony_ci int max_entries_sq; 46362306a36Sopenharmony_ci int max_entries_rq1; 46462306a36Sopenharmony_ci int max_entries_rq2; 46562306a36Sopenharmony_ci int max_entries_rq3; 46662306a36Sopenharmony_ci}; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cienum ehea_flag_bits { 46962306a36Sopenharmony_ci __EHEA_STOP_XFER, 47062306a36Sopenharmony_ci __EHEA_DISABLE_PORT_RESET 47162306a36Sopenharmony_ci}; 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_civoid ehea_set_ethtool_ops(struct net_device *netdev); 47462306a36Sopenharmony_ciint ehea_sense_port_attr(struct ehea_port *port); 47562306a36Sopenharmony_ciint ehea_set_portspeed(struct ehea_port *port, u32 port_speed); 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci#endif /* __EHEA_H__ */ 478