162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/**************************************************************************/ 362306a36Sopenharmony_ci/* */ 462306a36Sopenharmony_ci/* IBM System i and System p Virtual NIC Device Driver */ 562306a36Sopenharmony_ci/* Copyright (C) 2014 IBM Corp. */ 662306a36Sopenharmony_ci/* Santiago Leon (santi_leon@yahoo.com) */ 762306a36Sopenharmony_ci/* Thomas Falcon (tlfalcon@linux.vnet.ibm.com) */ 862306a36Sopenharmony_ci/* John Allen (jallen@linux.vnet.ibm.com) */ 962306a36Sopenharmony_ci/* */ 1062306a36Sopenharmony_ci/* */ 1162306a36Sopenharmony_ci/* This module contains the implementation of a virtual ethernet device */ 1262306a36Sopenharmony_ci/* for use with IBM i/pSeries LPAR Linux. It utilizes the logical LAN */ 1362306a36Sopenharmony_ci/* option of the RS/6000 Platform Architecture to interface with virtual */ 1462306a36Sopenharmony_ci/* ethernet NICs that are presented to the partition by the hypervisor. */ 1562306a36Sopenharmony_ci/* */ 1662306a36Sopenharmony_ci/**************************************************************************/ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define IBMVNIC_NAME "ibmvnic" 1962306a36Sopenharmony_ci#define IBMVNIC_DRIVER_VERSION "1.0.1" 2062306a36Sopenharmony_ci#define IBMVNIC_INVALID_MAP -1 2162306a36Sopenharmony_ci#define IBMVNIC_OPEN_FAILED 3 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* basic structures plus 100 2k buffers */ 2462306a36Sopenharmony_ci#define IBMVNIC_IO_ENTITLEMENT_DEFAULT 610305 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* Initial module_parameters */ 2762306a36Sopenharmony_ci#define IBMVNIC_RX_WEIGHT 16 2862306a36Sopenharmony_ci/* when changing this, update IBMVNIC_IO_ENTITLEMENT_DEFAULT */ 2962306a36Sopenharmony_ci#define IBMVNIC_BUFFS_PER_POOL 100 3062306a36Sopenharmony_ci#define IBMVNIC_MAX_QUEUES 16 3162306a36Sopenharmony_ci#define IBMVNIC_MAX_QUEUE_SZ 4096 3262306a36Sopenharmony_ci#define IBMVNIC_MAX_IND_DESCS 16 3362306a36Sopenharmony_ci#define IBMVNIC_IND_ARR_SZ (IBMVNIC_MAX_IND_DESCS * 32) 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define IBMVNIC_TSO_BUF_SZ 65536 3662306a36Sopenharmony_ci#define IBMVNIC_TSO_BUFS 64 3762306a36Sopenharmony_ci#define IBMVNIC_TSO_POOL_MASK 0x80000000 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* A VNIC adapter has set of Rx and Tx pools (aka queues). Each Rx/Tx pool 4062306a36Sopenharmony_ci * has a set of buffers. The size of each buffer is determined by the MTU. 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * Each Rx/Tx pool is also associated with a DMA region that is shared 4362306a36Sopenharmony_ci * with the "hardware" (VIOS) and used to send/receive packets. The DMA 4462306a36Sopenharmony_ci * region is also referred to as a Long Term Buffer or LTB. 4562306a36Sopenharmony_ci * 4662306a36Sopenharmony_ci * The size of the DMA region required for an Rx/Tx pool depends on the 4762306a36Sopenharmony_ci * number and size (MTU) of the buffers in the pool. At the max levels 4862306a36Sopenharmony_ci * of 4096 jumbo frames (MTU=9000) we will need about 9K*4K = 36MB plus 4962306a36Sopenharmony_ci * some padding. 5062306a36Sopenharmony_ci * 5162306a36Sopenharmony_ci * But the size of a single DMA region is limited by MAX_ORDER in the 5262306a36Sopenharmony_ci * kernel (about 16MB currently). To support say 4K Jumbo frames, we 5362306a36Sopenharmony_ci * use a set of LTBs (struct ltb_set) per pool. 5462306a36Sopenharmony_ci * 5562306a36Sopenharmony_ci * IBMVNIC_ONE_LTB_MAX - max size of each LTB supported by kernel 5662306a36Sopenharmony_ci * IBMVNIC_ONE_LTB_SIZE - current max size of each LTB in an ltb_set 5762306a36Sopenharmony_ci * (must be <= IBMVNIC_ONE_LTB_MAX) 5862306a36Sopenharmony_ci * IBMVNIC_LTB_SET_SIZE - current size of all LTBs in an ltb_set 5962306a36Sopenharmony_ci * 6062306a36Sopenharmony_ci * Each VNIC can have upto 16 Rx, 16 Tx and 16 TSO pools. The TSO pools 6162306a36Sopenharmony_ci * are of fixed length (IBMVNIC_TSO_BUF_SZ * IBMVNIC_TSO_BUFS) of 4MB. 6262306a36Sopenharmony_ci * 6362306a36Sopenharmony_ci * The Rx and Tx pools can have upto 4096 buffers. The max size of these 6462306a36Sopenharmony_ci * buffers is about 9588 (for jumbo frames, including IBMVNIC_BUFFER_HLEN). 6562306a36Sopenharmony_ci * So, setting the IBMVNIC_LTB_SET_SIZE for a pool to 4096 * 9588 ~= 38MB. 6662306a36Sopenharmony_ci * 6762306a36Sopenharmony_ci * There is a trade-off in setting IBMVNIC_ONE_LTB_SIZE. If it is large, 6862306a36Sopenharmony_ci * the allocation of the LTB can fail when system is low in memory. If 6962306a36Sopenharmony_ci * its too small, we would need several mappings for each of the Rx/ 7062306a36Sopenharmony_ci * Tx/TSO pools but there is a limit of 255 mappings per vnic in the 7162306a36Sopenharmony_ci * VNIC protocol. 7262306a36Sopenharmony_ci * 7362306a36Sopenharmony_ci * So setting IBMVNIC_ONE_LTB_SIZE to 8MB. With IBMVNIC_LTB_SET_SIZE set 7462306a36Sopenharmony_ci * to 38MB, we will need 5 LTBs per Rx and Tx pool and 1 LTB per TSO 7562306a36Sopenharmony_ci * pool for the 4MB. Thus the 16 Rx and Tx queues require 32 * 5 = 160 7662306a36Sopenharmony_ci * plus 16 for the TSO pools for a total of 176 LTB mappings per VNIC. 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_ci#define IBMVNIC_ONE_LTB_MAX ((u32)((1 << MAX_ORDER) * PAGE_SIZE)) 7962306a36Sopenharmony_ci#define IBMVNIC_ONE_LTB_SIZE min((u32)(8 << 20), IBMVNIC_ONE_LTB_MAX) 8062306a36Sopenharmony_ci#define IBMVNIC_LTB_SET_SIZE (38 << 20) 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define IBMVNIC_BUFFER_HLEN 500 8362306a36Sopenharmony_ci#define IBMVNIC_RESET_DELAY 100 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistruct ibmvnic_login_buffer { 8662306a36Sopenharmony_ci __be32 len; 8762306a36Sopenharmony_ci __be32 version; 8862306a36Sopenharmony_ci#define INITIAL_VERSION_LB 1 8962306a36Sopenharmony_ci __be32 num_txcomp_subcrqs; 9062306a36Sopenharmony_ci __be32 off_txcomp_subcrqs; 9162306a36Sopenharmony_ci __be32 num_rxcomp_subcrqs; 9262306a36Sopenharmony_ci __be32 off_rxcomp_subcrqs; 9362306a36Sopenharmony_ci __be32 login_rsp_ioba; 9462306a36Sopenharmony_ci __be32 login_rsp_len; 9562306a36Sopenharmony_ci __be32 client_data_offset; 9662306a36Sopenharmony_ci __be32 client_data_len; 9762306a36Sopenharmony_ci} __packed __aligned(8); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistruct ibmvnic_login_rsp_buffer { 10062306a36Sopenharmony_ci __be32 len; 10162306a36Sopenharmony_ci __be32 version; 10262306a36Sopenharmony_ci#define INITIAL_VERSION_LRB 1 10362306a36Sopenharmony_ci __be32 num_txsubm_subcrqs; 10462306a36Sopenharmony_ci __be32 off_txsubm_subcrqs; 10562306a36Sopenharmony_ci __be32 num_rxadd_subcrqs; 10662306a36Sopenharmony_ci __be32 off_rxadd_subcrqs; 10762306a36Sopenharmony_ci __be32 off_rxadd_buff_size; 10862306a36Sopenharmony_ci __be32 num_supp_tx_desc; 10962306a36Sopenharmony_ci __be32 off_supp_tx_desc; 11062306a36Sopenharmony_ci} __packed __aligned(8); 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistruct ibmvnic_query_ip_offload_buffer { 11362306a36Sopenharmony_ci __be32 len; 11462306a36Sopenharmony_ci __be32 version; 11562306a36Sopenharmony_ci#define INITIAL_VERSION_IOB 1 11662306a36Sopenharmony_ci u8 ipv4_chksum; 11762306a36Sopenharmony_ci u8 ipv6_chksum; 11862306a36Sopenharmony_ci u8 tcp_ipv4_chksum; 11962306a36Sopenharmony_ci u8 tcp_ipv6_chksum; 12062306a36Sopenharmony_ci u8 udp_ipv4_chksum; 12162306a36Sopenharmony_ci u8 udp_ipv6_chksum; 12262306a36Sopenharmony_ci u8 large_tx_ipv4; 12362306a36Sopenharmony_ci u8 large_tx_ipv6; 12462306a36Sopenharmony_ci u8 large_rx_ipv4; 12562306a36Sopenharmony_ci u8 large_rx_ipv6; 12662306a36Sopenharmony_ci u8 reserved1[14]; 12762306a36Sopenharmony_ci __be16 max_ipv4_header_size; 12862306a36Sopenharmony_ci __be16 max_ipv6_header_size; 12962306a36Sopenharmony_ci __be16 max_tcp_header_size; 13062306a36Sopenharmony_ci __be16 max_udp_header_size; 13162306a36Sopenharmony_ci __be32 max_large_tx_size; 13262306a36Sopenharmony_ci __be32 max_large_rx_size; 13362306a36Sopenharmony_ci u8 reserved2[16]; 13462306a36Sopenharmony_ci u8 ipv6_extension_header; 13562306a36Sopenharmony_ci#define IPV6_EH_NOT_SUPPORTED 0x00 13662306a36Sopenharmony_ci#define IPV6_EH_SUPPORTED_LIM 0x01 13762306a36Sopenharmony_ci#define IPV6_EH_SUPPORTED 0xFF 13862306a36Sopenharmony_ci u8 tcp_pseudosum_req; 13962306a36Sopenharmony_ci#define TCP_PS_NOT_REQUIRED 0x00 14062306a36Sopenharmony_ci#define TCP_PS_REQUIRED 0x01 14162306a36Sopenharmony_ci u8 reserved3[30]; 14262306a36Sopenharmony_ci __be16 num_ipv6_ext_headers; 14362306a36Sopenharmony_ci __be32 off_ipv6_ext_headers; 14462306a36Sopenharmony_ci u8 reserved4[154]; 14562306a36Sopenharmony_ci} __packed __aligned(8); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistruct ibmvnic_control_ip_offload_buffer { 14862306a36Sopenharmony_ci __be32 len; 14962306a36Sopenharmony_ci __be32 version; 15062306a36Sopenharmony_ci#define INITIAL_VERSION_IOB 1 15162306a36Sopenharmony_ci u8 ipv4_chksum; 15262306a36Sopenharmony_ci u8 ipv6_chksum; 15362306a36Sopenharmony_ci u8 tcp_ipv4_chksum; 15462306a36Sopenharmony_ci u8 tcp_ipv6_chksum; 15562306a36Sopenharmony_ci u8 udp_ipv4_chksum; 15662306a36Sopenharmony_ci u8 udp_ipv6_chksum; 15762306a36Sopenharmony_ci u8 large_tx_ipv4; 15862306a36Sopenharmony_ci u8 large_tx_ipv6; 15962306a36Sopenharmony_ci u8 bad_packet_rx; 16062306a36Sopenharmony_ci u8 large_rx_ipv4; 16162306a36Sopenharmony_ci u8 large_rx_ipv6; 16262306a36Sopenharmony_ci u8 reserved4[111]; 16362306a36Sopenharmony_ci} __packed __aligned(8); 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistruct ibmvnic_fw_component { 16662306a36Sopenharmony_ci u8 name[48]; 16762306a36Sopenharmony_ci __be32 trace_buff_size; 16862306a36Sopenharmony_ci u8 correlator; 16962306a36Sopenharmony_ci u8 trace_level; 17062306a36Sopenharmony_ci u8 parent_correlator; 17162306a36Sopenharmony_ci u8 error_check_level; 17262306a36Sopenharmony_ci u8 trace_on; 17362306a36Sopenharmony_ci u8 reserved[7]; 17462306a36Sopenharmony_ci u8 description[192]; 17562306a36Sopenharmony_ci} __packed __aligned(8); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistruct ibmvnic_fw_trace_entry { 17862306a36Sopenharmony_ci __be32 trace_id; 17962306a36Sopenharmony_ci u8 num_valid_data; 18062306a36Sopenharmony_ci u8 reserved[3]; 18162306a36Sopenharmony_ci __be64 pmc_registers; 18262306a36Sopenharmony_ci __be64 timebase; 18362306a36Sopenharmony_ci __be64 trace_data[5]; 18462306a36Sopenharmony_ci} __packed __aligned(8); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistruct ibmvnic_statistics { 18762306a36Sopenharmony_ci __be32 version; 18862306a36Sopenharmony_ci __be32 promiscuous; 18962306a36Sopenharmony_ci __be64 rx_packets; 19062306a36Sopenharmony_ci __be64 rx_bytes; 19162306a36Sopenharmony_ci __be64 tx_packets; 19262306a36Sopenharmony_ci __be64 tx_bytes; 19362306a36Sopenharmony_ci __be64 ucast_tx_packets; 19462306a36Sopenharmony_ci __be64 ucast_rx_packets; 19562306a36Sopenharmony_ci __be64 mcast_tx_packets; 19662306a36Sopenharmony_ci __be64 mcast_rx_packets; 19762306a36Sopenharmony_ci __be64 bcast_tx_packets; 19862306a36Sopenharmony_ci __be64 bcast_rx_packets; 19962306a36Sopenharmony_ci __be64 align_errors; 20062306a36Sopenharmony_ci __be64 fcs_errors; 20162306a36Sopenharmony_ci __be64 single_collision_frames; 20262306a36Sopenharmony_ci __be64 multi_collision_frames; 20362306a36Sopenharmony_ci __be64 sqe_test_errors; 20462306a36Sopenharmony_ci __be64 deferred_tx; 20562306a36Sopenharmony_ci __be64 late_collisions; 20662306a36Sopenharmony_ci __be64 excess_collisions; 20762306a36Sopenharmony_ci __be64 internal_mac_tx_errors; 20862306a36Sopenharmony_ci __be64 carrier_sense; 20962306a36Sopenharmony_ci __be64 too_long_frames; 21062306a36Sopenharmony_ci __be64 internal_mac_rx_errors; 21162306a36Sopenharmony_ci u8 reserved[72]; 21262306a36Sopenharmony_ci} __packed __aligned(8); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci#define NUM_TX_STATS 3 21562306a36Sopenharmony_cistruct ibmvnic_tx_queue_stats { 21662306a36Sopenharmony_ci u64 packets; 21762306a36Sopenharmony_ci u64 bytes; 21862306a36Sopenharmony_ci u64 dropped_packets; 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci#define NUM_RX_STATS 3 22262306a36Sopenharmony_cistruct ibmvnic_rx_queue_stats { 22362306a36Sopenharmony_ci u64 packets; 22462306a36Sopenharmony_ci u64 bytes; 22562306a36Sopenharmony_ci u64 interrupts; 22662306a36Sopenharmony_ci}; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistruct ibmvnic_acl_buffer { 22962306a36Sopenharmony_ci __be32 len; 23062306a36Sopenharmony_ci __be32 version; 23162306a36Sopenharmony_ci#define INITIAL_VERSION_IOB 1 23262306a36Sopenharmony_ci u8 mac_acls_restrict; 23362306a36Sopenharmony_ci u8 vlan_acls_restrict; 23462306a36Sopenharmony_ci u8 reserved1[22]; 23562306a36Sopenharmony_ci __be32 num_mac_addrs; 23662306a36Sopenharmony_ci __be32 offset_mac_addrs; 23762306a36Sopenharmony_ci __be32 num_vlan_ids; 23862306a36Sopenharmony_ci __be32 offset_vlan_ids; 23962306a36Sopenharmony_ci u8 reserved2[80]; 24062306a36Sopenharmony_ci} __packed __aligned(8); 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci/* descriptors have been changed, how should this be defined? 1? 4? */ 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci#define IBMVNIC_TX_DESC_VERSIONS 3 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci/* is this still needed? */ 24762306a36Sopenharmony_cistruct ibmvnic_tx_comp_desc { 24862306a36Sopenharmony_ci u8 first; 24962306a36Sopenharmony_ci u8 num_comps; 25062306a36Sopenharmony_ci __be16 rcs[5]; 25162306a36Sopenharmony_ci __be32 correlators[5]; 25262306a36Sopenharmony_ci} __packed __aligned(8); 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci/* some flags that included in v0 descriptor, which is gone 25562306a36Sopenharmony_ci * only used for IBMVNIC_TCP_CHKSUM and IBMVNIC_UDP_CHKSUM 25662306a36Sopenharmony_ci * and only in some offload_flags variable that doesn't seem 25762306a36Sopenharmony_ci * to be used anywhere, can probably be removed? 25862306a36Sopenharmony_ci */ 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci#define IBMVNIC_TCP_CHKSUM 0x20 26162306a36Sopenharmony_ci#define IBMVNIC_UDP_CHKSUM 0x08 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistruct ibmvnic_tx_desc { 26462306a36Sopenharmony_ci u8 first; 26562306a36Sopenharmony_ci u8 type; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci#define IBMVNIC_TX_DESC 0x10 26862306a36Sopenharmony_ci u8 n_crq_elem; 26962306a36Sopenharmony_ci u8 n_sge; 27062306a36Sopenharmony_ci u8 flags1; 27162306a36Sopenharmony_ci#define IBMVNIC_TX_COMP_NEEDED 0x80 27262306a36Sopenharmony_ci#define IBMVNIC_TX_CHKSUM_OFFLOAD 0x40 27362306a36Sopenharmony_ci#define IBMVNIC_TX_LSO 0x20 27462306a36Sopenharmony_ci#define IBMVNIC_TX_PROT_TCP 0x10 27562306a36Sopenharmony_ci#define IBMVNIC_TX_PROT_UDP 0x08 27662306a36Sopenharmony_ci#define IBMVNIC_TX_PROT_IPV4 0x04 27762306a36Sopenharmony_ci#define IBMVNIC_TX_PROT_IPV6 0x02 27862306a36Sopenharmony_ci#define IBMVNIC_TX_VLAN_PRESENT 0x01 27962306a36Sopenharmony_ci u8 flags2; 28062306a36Sopenharmony_ci#define IBMVNIC_TX_VLAN_INSERT 0x80 28162306a36Sopenharmony_ci __be16 mss; 28262306a36Sopenharmony_ci u8 reserved[4]; 28362306a36Sopenharmony_ci __be32 correlator; 28462306a36Sopenharmony_ci __be16 vlan_id; 28562306a36Sopenharmony_ci __be16 dma_reg; 28662306a36Sopenharmony_ci __be32 sge_len; 28762306a36Sopenharmony_ci __be64 ioba; 28862306a36Sopenharmony_ci} __packed __aligned(8); 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistruct ibmvnic_hdr_desc { 29162306a36Sopenharmony_ci u8 first; 29262306a36Sopenharmony_ci u8 type; 29362306a36Sopenharmony_ci#define IBMVNIC_HDR_DESC 0x11 29462306a36Sopenharmony_ci u8 len; 29562306a36Sopenharmony_ci u8 l2_len; 29662306a36Sopenharmony_ci __be16 l3_len; 29762306a36Sopenharmony_ci u8 l4_len; 29862306a36Sopenharmony_ci u8 flag; 29962306a36Sopenharmony_ci u8 data[24]; 30062306a36Sopenharmony_ci} __packed __aligned(8); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistruct ibmvnic_hdr_ext_desc { 30362306a36Sopenharmony_ci u8 first; 30462306a36Sopenharmony_ci u8 type; 30562306a36Sopenharmony_ci#define IBMVNIC_HDR_EXT_DESC 0x12 30662306a36Sopenharmony_ci u8 len; 30762306a36Sopenharmony_ci u8 data[29]; 30862306a36Sopenharmony_ci} __packed __aligned(8); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistruct ibmvnic_sge_desc { 31162306a36Sopenharmony_ci u8 first; 31262306a36Sopenharmony_ci u8 type; 31362306a36Sopenharmony_ci#define IBMVNIC_SGE_DESC 0x30 31462306a36Sopenharmony_ci __be16 sge1_dma_reg; 31562306a36Sopenharmony_ci __be32 sge1_len; 31662306a36Sopenharmony_ci __be64 sge1_ioba; 31762306a36Sopenharmony_ci __be16 reserved; 31862306a36Sopenharmony_ci __be16 sge2_dma_reg; 31962306a36Sopenharmony_ci __be32 sge2_len; 32062306a36Sopenharmony_ci __be64 sge2_ioba; 32162306a36Sopenharmony_ci} __packed __aligned(8); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistruct ibmvnic_rx_comp_desc { 32462306a36Sopenharmony_ci u8 first; 32562306a36Sopenharmony_ci u8 flags; 32662306a36Sopenharmony_ci#define IBMVNIC_IP_CHKSUM_GOOD 0x80 32762306a36Sopenharmony_ci#define IBMVNIC_TCP_UDP_CHKSUM_GOOD 0x40 32862306a36Sopenharmony_ci#define IBMVNIC_END_FRAME 0x20 32962306a36Sopenharmony_ci#define IBMVNIC_EXACT_MC 0x10 33062306a36Sopenharmony_ci#define IBMVNIC_VLAN_STRIPPED 0x08 33162306a36Sopenharmony_ci __be16 off_frame_data; 33262306a36Sopenharmony_ci __be32 len; 33362306a36Sopenharmony_ci __be64 correlator; 33462306a36Sopenharmony_ci __be16 vlan_tci; 33562306a36Sopenharmony_ci __be16 rc; 33662306a36Sopenharmony_ci u8 reserved[12]; 33762306a36Sopenharmony_ci} __packed __aligned(8); 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistruct ibmvnic_generic_scrq { 34062306a36Sopenharmony_ci u8 first; 34162306a36Sopenharmony_ci u8 reserved[31]; 34262306a36Sopenharmony_ci} __packed __aligned(8); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistruct ibmvnic_rx_buff_add_desc { 34562306a36Sopenharmony_ci u8 first; 34662306a36Sopenharmony_ci u8 reserved[7]; 34762306a36Sopenharmony_ci __be64 correlator; 34862306a36Sopenharmony_ci __be32 ioba; 34962306a36Sopenharmony_ci u8 map_id; 35062306a36Sopenharmony_ci __be32 len:24; 35162306a36Sopenharmony_ci u8 reserved2[8]; 35262306a36Sopenharmony_ci} __packed __aligned(8); 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistruct ibmvnic_rc { 35562306a36Sopenharmony_ci u8 code; /* one of enum ibmvnic_rc_codes */ 35662306a36Sopenharmony_ci u8 detailed_data[3]; 35762306a36Sopenharmony_ci} __packed __aligned(4); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistruct ibmvnic_generic_crq { 36062306a36Sopenharmony_ci u8 first; 36162306a36Sopenharmony_ci u8 cmd; 36262306a36Sopenharmony_ci u8 params[10]; 36362306a36Sopenharmony_ci struct ibmvnic_rc rc; 36462306a36Sopenharmony_ci} __packed __aligned(8); 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_cistruct ibmvnic_version_exchange { 36762306a36Sopenharmony_ci u8 first; 36862306a36Sopenharmony_ci u8 cmd; 36962306a36Sopenharmony_ci __be16 version; 37062306a36Sopenharmony_ci#define IBMVNIC_INITIAL_VERSION 1 37162306a36Sopenharmony_ci u8 reserved[8]; 37262306a36Sopenharmony_ci struct ibmvnic_rc rc; 37362306a36Sopenharmony_ci} __packed __aligned(8); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistruct ibmvnic_capability { 37662306a36Sopenharmony_ci u8 first; 37762306a36Sopenharmony_ci u8 cmd; 37862306a36Sopenharmony_ci __be16 capability; /* one of ibmvnic_capabilities */ 37962306a36Sopenharmony_ci __be64 number; 38062306a36Sopenharmony_ci struct ibmvnic_rc rc; 38162306a36Sopenharmony_ci} __packed __aligned(8); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistruct ibmvnic_login { 38462306a36Sopenharmony_ci u8 first; 38562306a36Sopenharmony_ci u8 cmd; 38662306a36Sopenharmony_ci u8 reserved[6]; 38762306a36Sopenharmony_ci __be32 ioba; 38862306a36Sopenharmony_ci __be32 len; 38962306a36Sopenharmony_ci} __packed __aligned(8); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistruct ibmvnic_phys_parms { 39262306a36Sopenharmony_ci u8 first; 39362306a36Sopenharmony_ci u8 cmd; 39462306a36Sopenharmony_ci u8 flags1; 39562306a36Sopenharmony_ci#define IBMVNIC_EXTERNAL_LOOPBACK 0x80 39662306a36Sopenharmony_ci#define IBMVNIC_INTERNAL_LOOPBACK 0x40 39762306a36Sopenharmony_ci#define IBMVNIC_PROMISC 0x20 39862306a36Sopenharmony_ci#define IBMVNIC_PHYS_LINK_ACTIVE 0x10 39962306a36Sopenharmony_ci#define IBMVNIC_AUTONEG_DUPLEX 0x08 40062306a36Sopenharmony_ci#define IBMVNIC_FULL_DUPLEX 0x04 40162306a36Sopenharmony_ci#define IBMVNIC_HALF_DUPLEX 0x02 40262306a36Sopenharmony_ci#define IBMVNIC_CAN_CHG_PHYS_PARMS 0x01 40362306a36Sopenharmony_ci u8 flags2; 40462306a36Sopenharmony_ci#define IBMVNIC_LOGICAL_LNK_ACTIVE 0x80 40562306a36Sopenharmony_ci __be32 speed; 40662306a36Sopenharmony_ci#define IBMVNIC_AUTONEG 0x80000000 40762306a36Sopenharmony_ci#define IBMVNIC_10MBPS 0x40000000 40862306a36Sopenharmony_ci#define IBMVNIC_100MBPS 0x20000000 40962306a36Sopenharmony_ci#define IBMVNIC_1GBPS 0x10000000 41062306a36Sopenharmony_ci#define IBMVNIC_10GBPS 0x08000000 41162306a36Sopenharmony_ci#define IBMVNIC_40GBPS 0x04000000 41262306a36Sopenharmony_ci#define IBMVNIC_100GBPS 0x02000000 41362306a36Sopenharmony_ci#define IBMVNIC_25GBPS 0x01000000 41462306a36Sopenharmony_ci#define IBMVNIC_50GBPS 0x00800000 41562306a36Sopenharmony_ci#define IBMVNIC_200GBPS 0x00400000 41662306a36Sopenharmony_ci __be32 mtu; 41762306a36Sopenharmony_ci struct ibmvnic_rc rc; 41862306a36Sopenharmony_ci} __packed __aligned(8); 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistruct ibmvnic_logical_link_state { 42162306a36Sopenharmony_ci u8 first; 42262306a36Sopenharmony_ci u8 cmd; 42362306a36Sopenharmony_ci u8 link_state; 42462306a36Sopenharmony_ci#define IBMVNIC_LOGICAL_LNK_DN 0x00 42562306a36Sopenharmony_ci#define IBMVNIC_LOGICAL_LNK_UP 0x01 42662306a36Sopenharmony_ci#define IBMVNIC_LOGICAL_LNK_QUERY 0xff 42762306a36Sopenharmony_ci u8 reserved[9]; 42862306a36Sopenharmony_ci struct ibmvnic_rc rc; 42962306a36Sopenharmony_ci} __packed __aligned(8); 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_cistruct ibmvnic_query_ip_offload { 43262306a36Sopenharmony_ci u8 first; 43362306a36Sopenharmony_ci u8 cmd; 43462306a36Sopenharmony_ci u8 reserved[2]; 43562306a36Sopenharmony_ci __be32 len; 43662306a36Sopenharmony_ci __be32 ioba; 43762306a36Sopenharmony_ci struct ibmvnic_rc rc; 43862306a36Sopenharmony_ci} __packed __aligned(8); 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_cistruct ibmvnic_control_ip_offload { 44162306a36Sopenharmony_ci u8 first; 44262306a36Sopenharmony_ci u8 cmd; 44362306a36Sopenharmony_ci u8 reserved[2]; 44462306a36Sopenharmony_ci __be32 ioba; 44562306a36Sopenharmony_ci __be32 len; 44662306a36Sopenharmony_ci struct ibmvnic_rc rc; 44762306a36Sopenharmony_ci} __packed __aligned(8); 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_cistruct ibmvnic_request_statistics { 45062306a36Sopenharmony_ci u8 first; 45162306a36Sopenharmony_ci u8 cmd; 45262306a36Sopenharmony_ci u8 flags; 45362306a36Sopenharmony_ci#define IBMVNIC_PHYSICAL_PORT 0x80 45462306a36Sopenharmony_ci u8 reserved1; 45562306a36Sopenharmony_ci __be32 ioba; 45662306a36Sopenharmony_ci __be32 len; 45762306a36Sopenharmony_ci u8 reserved[4]; 45862306a36Sopenharmony_ci} __packed __aligned(8); 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistruct ibmvnic_error_indication { 46162306a36Sopenharmony_ci u8 first; 46262306a36Sopenharmony_ci u8 cmd; 46362306a36Sopenharmony_ci u8 flags; 46462306a36Sopenharmony_ci#define IBMVNIC_FATAL_ERROR 0x80 46562306a36Sopenharmony_ci u8 reserved1; 46662306a36Sopenharmony_ci __be32 error_id; 46762306a36Sopenharmony_ci __be32 detail_error_sz; 46862306a36Sopenharmony_ci __be16 error_cause; 46962306a36Sopenharmony_ci u8 reserved2[2]; 47062306a36Sopenharmony_ci} __packed __aligned(8); 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_cistruct ibmvnic_link_state_indication { 47362306a36Sopenharmony_ci u8 first; 47462306a36Sopenharmony_ci u8 cmd; 47562306a36Sopenharmony_ci u8 reserved1[2]; 47662306a36Sopenharmony_ci u8 phys_link_state; 47762306a36Sopenharmony_ci u8 logical_link_state; 47862306a36Sopenharmony_ci u8 reserved2[10]; 47962306a36Sopenharmony_ci} __packed __aligned(8); 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_cistruct ibmvnic_change_mac_addr { 48262306a36Sopenharmony_ci u8 first; 48362306a36Sopenharmony_ci u8 cmd; 48462306a36Sopenharmony_ci u8 mac_addr[6]; 48562306a36Sopenharmony_ci u8 reserved[4]; 48662306a36Sopenharmony_ci struct ibmvnic_rc rc; 48762306a36Sopenharmony_ci} __packed __aligned(8); 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_cistruct ibmvnic_multicast_ctrl { 49062306a36Sopenharmony_ci u8 first; 49162306a36Sopenharmony_ci u8 cmd; 49262306a36Sopenharmony_ci u8 mac_addr[6]; 49362306a36Sopenharmony_ci u8 flags; 49462306a36Sopenharmony_ci#define IBMVNIC_ENABLE_MC 0x80 49562306a36Sopenharmony_ci#define IBMVNIC_DISABLE_MC 0x40 49662306a36Sopenharmony_ci#define IBMVNIC_ENABLE_ALL 0x20 49762306a36Sopenharmony_ci#define IBMVNIC_DISABLE_ALL 0x10 49862306a36Sopenharmony_ci u8 reserved1; 49962306a36Sopenharmony_ci __be16 reserved2; /* was num_enabled_mc_addr; */ 50062306a36Sopenharmony_ci struct ibmvnic_rc rc; 50162306a36Sopenharmony_ci} __packed __aligned(8); 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_cistruct ibmvnic_get_vpd_size { 50462306a36Sopenharmony_ci u8 first; 50562306a36Sopenharmony_ci u8 cmd; 50662306a36Sopenharmony_ci u8 reserved[14]; 50762306a36Sopenharmony_ci} __packed __aligned(8); 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_cistruct ibmvnic_get_vpd_size_rsp { 51062306a36Sopenharmony_ci u8 first; 51162306a36Sopenharmony_ci u8 cmd; 51262306a36Sopenharmony_ci u8 reserved[2]; 51362306a36Sopenharmony_ci __be64 len; 51462306a36Sopenharmony_ci struct ibmvnic_rc rc; 51562306a36Sopenharmony_ci} __packed __aligned(8); 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistruct ibmvnic_get_vpd { 51862306a36Sopenharmony_ci u8 first; 51962306a36Sopenharmony_ci u8 cmd; 52062306a36Sopenharmony_ci u8 reserved1[2]; 52162306a36Sopenharmony_ci __be32 ioba; 52262306a36Sopenharmony_ci __be32 len; 52362306a36Sopenharmony_ci u8 reserved[4]; 52462306a36Sopenharmony_ci} __packed __aligned(8); 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistruct ibmvnic_get_vpd_rsp { 52762306a36Sopenharmony_ci u8 first; 52862306a36Sopenharmony_ci u8 cmd; 52962306a36Sopenharmony_ci u8 reserved[10]; 53062306a36Sopenharmony_ci struct ibmvnic_rc rc; 53162306a36Sopenharmony_ci} __packed __aligned(8); 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_cistruct ibmvnic_acl_change_indication { 53462306a36Sopenharmony_ci u8 first; 53562306a36Sopenharmony_ci u8 cmd; 53662306a36Sopenharmony_ci __be16 change_type; 53762306a36Sopenharmony_ci#define IBMVNIC_MAC_ACL 0 53862306a36Sopenharmony_ci#define IBMVNIC_VLAN_ACL 1 53962306a36Sopenharmony_ci u8 reserved[12]; 54062306a36Sopenharmony_ci} __packed __aligned(8); 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_cistruct ibmvnic_acl_query { 54362306a36Sopenharmony_ci u8 first; 54462306a36Sopenharmony_ci u8 cmd; 54562306a36Sopenharmony_ci u8 reserved1[2]; 54662306a36Sopenharmony_ci __be32 ioba; 54762306a36Sopenharmony_ci __be32 len; 54862306a36Sopenharmony_ci u8 reserved2[4]; 54962306a36Sopenharmony_ci} __packed __aligned(8); 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_cistruct ibmvnic_tune { 55262306a36Sopenharmony_ci u8 first; 55362306a36Sopenharmony_ci u8 cmd; 55462306a36Sopenharmony_ci u8 reserved1[2]; 55562306a36Sopenharmony_ci __be32 ioba; 55662306a36Sopenharmony_ci __be32 len; 55762306a36Sopenharmony_ci u8 reserved2[4]; 55862306a36Sopenharmony_ci} __packed __aligned(8); 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_cistruct ibmvnic_request_map { 56162306a36Sopenharmony_ci u8 first; 56262306a36Sopenharmony_ci u8 cmd; 56362306a36Sopenharmony_ci u8 reserved1; 56462306a36Sopenharmony_ci u8 map_id; 56562306a36Sopenharmony_ci __be32 ioba; 56662306a36Sopenharmony_ci __be32 len; 56762306a36Sopenharmony_ci u8 reserved2[4]; 56862306a36Sopenharmony_ci} __packed __aligned(8); 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_cistruct ibmvnic_request_map_rsp { 57162306a36Sopenharmony_ci u8 first; 57262306a36Sopenharmony_ci u8 cmd; 57362306a36Sopenharmony_ci u8 reserved1; 57462306a36Sopenharmony_ci u8 map_id; 57562306a36Sopenharmony_ci u8 reserved2[8]; 57662306a36Sopenharmony_ci struct ibmvnic_rc rc; 57762306a36Sopenharmony_ci} __packed __aligned(8); 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_cistruct ibmvnic_request_unmap { 58062306a36Sopenharmony_ci u8 first; 58162306a36Sopenharmony_ci u8 cmd; 58262306a36Sopenharmony_ci u8 reserved1; 58362306a36Sopenharmony_ci u8 map_id; 58462306a36Sopenharmony_ci u8 reserved2[12]; 58562306a36Sopenharmony_ci} __packed __aligned(8); 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_cistruct ibmvnic_request_unmap_rsp { 58862306a36Sopenharmony_ci u8 first; 58962306a36Sopenharmony_ci u8 cmd; 59062306a36Sopenharmony_ci u8 reserved1; 59162306a36Sopenharmony_ci u8 map_id; 59262306a36Sopenharmony_ci u8 reserved2[8]; 59362306a36Sopenharmony_ci struct ibmvnic_rc rc; 59462306a36Sopenharmony_ci} __packed __aligned(8); 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_cistruct ibmvnic_query_map { 59762306a36Sopenharmony_ci u8 first; 59862306a36Sopenharmony_ci u8 cmd; 59962306a36Sopenharmony_ci u8 reserved[14]; 60062306a36Sopenharmony_ci} __packed __aligned(8); 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_cistruct ibmvnic_query_map_rsp { 60362306a36Sopenharmony_ci u8 first; 60462306a36Sopenharmony_ci u8 cmd; 60562306a36Sopenharmony_ci u8 reserved; 60662306a36Sopenharmony_ci u8 page_size; 60762306a36Sopenharmony_ci __be32 tot_pages; 60862306a36Sopenharmony_ci __be32 free_pages; 60962306a36Sopenharmony_ci struct ibmvnic_rc rc; 61062306a36Sopenharmony_ci} __packed __aligned(8); 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ciunion ibmvnic_crq { 61362306a36Sopenharmony_ci struct ibmvnic_generic_crq generic; 61462306a36Sopenharmony_ci struct ibmvnic_version_exchange version_exchange; 61562306a36Sopenharmony_ci struct ibmvnic_version_exchange version_exchange_rsp; 61662306a36Sopenharmony_ci struct ibmvnic_capability query_capability; 61762306a36Sopenharmony_ci struct ibmvnic_capability query_capability_rsp; 61862306a36Sopenharmony_ci struct ibmvnic_capability request_capability; 61962306a36Sopenharmony_ci struct ibmvnic_capability request_capability_rsp; 62062306a36Sopenharmony_ci struct ibmvnic_login login; 62162306a36Sopenharmony_ci struct ibmvnic_generic_crq login_rsp; 62262306a36Sopenharmony_ci struct ibmvnic_phys_parms query_phys_parms; 62362306a36Sopenharmony_ci struct ibmvnic_phys_parms query_phys_parms_rsp; 62462306a36Sopenharmony_ci struct ibmvnic_phys_parms query_phys_capabilities; 62562306a36Sopenharmony_ci struct ibmvnic_phys_parms query_phys_capabilities_rsp; 62662306a36Sopenharmony_ci struct ibmvnic_phys_parms set_phys_parms; 62762306a36Sopenharmony_ci struct ibmvnic_phys_parms set_phys_parms_rsp; 62862306a36Sopenharmony_ci struct ibmvnic_logical_link_state logical_link_state; 62962306a36Sopenharmony_ci struct ibmvnic_logical_link_state logical_link_state_rsp; 63062306a36Sopenharmony_ci struct ibmvnic_query_ip_offload query_ip_offload; 63162306a36Sopenharmony_ci struct ibmvnic_query_ip_offload query_ip_offload_rsp; 63262306a36Sopenharmony_ci struct ibmvnic_control_ip_offload control_ip_offload; 63362306a36Sopenharmony_ci struct ibmvnic_control_ip_offload control_ip_offload_rsp; 63462306a36Sopenharmony_ci struct ibmvnic_request_statistics request_statistics; 63562306a36Sopenharmony_ci struct ibmvnic_generic_crq request_statistics_rsp; 63662306a36Sopenharmony_ci struct ibmvnic_error_indication error_indication; 63762306a36Sopenharmony_ci struct ibmvnic_link_state_indication link_state_indication; 63862306a36Sopenharmony_ci struct ibmvnic_change_mac_addr change_mac_addr; 63962306a36Sopenharmony_ci struct ibmvnic_change_mac_addr change_mac_addr_rsp; 64062306a36Sopenharmony_ci struct ibmvnic_multicast_ctrl multicast_ctrl; 64162306a36Sopenharmony_ci struct ibmvnic_multicast_ctrl multicast_ctrl_rsp; 64262306a36Sopenharmony_ci struct ibmvnic_get_vpd_size get_vpd_size; 64362306a36Sopenharmony_ci struct ibmvnic_get_vpd_size_rsp get_vpd_size_rsp; 64462306a36Sopenharmony_ci struct ibmvnic_get_vpd get_vpd; 64562306a36Sopenharmony_ci struct ibmvnic_get_vpd_rsp get_vpd_rsp; 64662306a36Sopenharmony_ci struct ibmvnic_acl_change_indication acl_change_indication; 64762306a36Sopenharmony_ci struct ibmvnic_acl_query acl_query; 64862306a36Sopenharmony_ci struct ibmvnic_generic_crq acl_query_rsp; 64962306a36Sopenharmony_ci struct ibmvnic_tune tune; 65062306a36Sopenharmony_ci struct ibmvnic_generic_crq tune_rsp; 65162306a36Sopenharmony_ci struct ibmvnic_request_map request_map; 65262306a36Sopenharmony_ci struct ibmvnic_request_map_rsp request_map_rsp; 65362306a36Sopenharmony_ci struct ibmvnic_request_unmap request_unmap; 65462306a36Sopenharmony_ci struct ibmvnic_request_unmap_rsp request_unmap_rsp; 65562306a36Sopenharmony_ci struct ibmvnic_query_map query_map; 65662306a36Sopenharmony_ci struct ibmvnic_query_map_rsp query_map_rsp; 65762306a36Sopenharmony_ci}; 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_cienum ibmvnic_rc_codes { 66062306a36Sopenharmony_ci SUCCESS = 0, 66162306a36Sopenharmony_ci PARTIALSUCCESS = 1, 66262306a36Sopenharmony_ci PERMISSION = 2, 66362306a36Sopenharmony_ci NOMEMORY = 3, 66462306a36Sopenharmony_ci PARAMETER = 4, 66562306a36Sopenharmony_ci UNKNOWNCOMMAND = 5, 66662306a36Sopenharmony_ci ABORTED = 6, 66762306a36Sopenharmony_ci INVALIDSTATE = 7, 66862306a36Sopenharmony_ci INVALIDIOBA = 8, 66962306a36Sopenharmony_ci INVALIDLENGTH = 9, 67062306a36Sopenharmony_ci UNSUPPORTEDOPTION = 10, 67162306a36Sopenharmony_ci}; 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_cienum ibmvnic_capabilities { 67462306a36Sopenharmony_ci MIN_TX_QUEUES = 1, 67562306a36Sopenharmony_ci MIN_RX_QUEUES = 2, 67662306a36Sopenharmony_ci MIN_RX_ADD_QUEUES = 3, 67762306a36Sopenharmony_ci MAX_TX_QUEUES = 4, 67862306a36Sopenharmony_ci MAX_RX_QUEUES = 5, 67962306a36Sopenharmony_ci MAX_RX_ADD_QUEUES = 6, 68062306a36Sopenharmony_ci REQ_TX_QUEUES = 7, 68162306a36Sopenharmony_ci REQ_RX_QUEUES = 8, 68262306a36Sopenharmony_ci REQ_RX_ADD_QUEUES = 9, 68362306a36Sopenharmony_ci MIN_TX_ENTRIES_PER_SUBCRQ = 10, 68462306a36Sopenharmony_ci MIN_RX_ADD_ENTRIES_PER_SUBCRQ = 11, 68562306a36Sopenharmony_ci MAX_TX_ENTRIES_PER_SUBCRQ = 12, 68662306a36Sopenharmony_ci MAX_RX_ADD_ENTRIES_PER_SUBCRQ = 13, 68762306a36Sopenharmony_ci REQ_TX_ENTRIES_PER_SUBCRQ = 14, 68862306a36Sopenharmony_ci REQ_RX_ADD_ENTRIES_PER_SUBCRQ = 15, 68962306a36Sopenharmony_ci TCP_IP_OFFLOAD = 16, 69062306a36Sopenharmony_ci PROMISC_REQUESTED = 17, 69162306a36Sopenharmony_ci PROMISC_SUPPORTED = 18, 69262306a36Sopenharmony_ci MIN_MTU = 19, 69362306a36Sopenharmony_ci MAX_MTU = 20, 69462306a36Sopenharmony_ci REQ_MTU = 21, 69562306a36Sopenharmony_ci MAX_MULTICAST_FILTERS = 22, 69662306a36Sopenharmony_ci VLAN_HEADER_INSERTION = 23, 69762306a36Sopenharmony_ci RX_VLAN_HEADER_INSERTION = 24, 69862306a36Sopenharmony_ci MAX_TX_SG_ENTRIES = 25, 69962306a36Sopenharmony_ci RX_SG_SUPPORTED = 26, 70062306a36Sopenharmony_ci RX_SG_REQUESTED = 27, 70162306a36Sopenharmony_ci OPT_TX_COMP_SUB_QUEUES = 28, 70262306a36Sopenharmony_ci OPT_RX_COMP_QUEUES = 29, 70362306a36Sopenharmony_ci OPT_RX_BUFADD_Q_PER_RX_COMP_Q = 30, 70462306a36Sopenharmony_ci OPT_TX_ENTRIES_PER_SUBCRQ = 31, 70562306a36Sopenharmony_ci OPT_RXBA_ENTRIES_PER_SUBCRQ = 32, 70662306a36Sopenharmony_ci TX_RX_DESC_REQ = 33, 70762306a36Sopenharmony_ci}; 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_cienum ibmvnic_error_cause { 71062306a36Sopenharmony_ci ADAPTER_PROBLEM = 0, 71162306a36Sopenharmony_ci BUS_PROBLEM = 1, 71262306a36Sopenharmony_ci FW_PROBLEM = 2, 71362306a36Sopenharmony_ci DD_PROBLEM = 3, 71462306a36Sopenharmony_ci EEH_RECOVERY = 4, 71562306a36Sopenharmony_ci FW_UPDATED = 5, 71662306a36Sopenharmony_ci LOW_MEMORY = 6, 71762306a36Sopenharmony_ci}; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_cienum ibmvnic_commands { 72062306a36Sopenharmony_ci VERSION_EXCHANGE = 0x01, 72162306a36Sopenharmony_ci VERSION_EXCHANGE_RSP = 0x81, 72262306a36Sopenharmony_ci QUERY_CAPABILITY = 0x02, 72362306a36Sopenharmony_ci QUERY_CAPABILITY_RSP = 0x82, 72462306a36Sopenharmony_ci REQUEST_CAPABILITY = 0x03, 72562306a36Sopenharmony_ci REQUEST_CAPABILITY_RSP = 0x83, 72662306a36Sopenharmony_ci LOGIN = 0x04, 72762306a36Sopenharmony_ci LOGIN_RSP = 0x84, 72862306a36Sopenharmony_ci QUERY_PHYS_PARMS = 0x05, 72962306a36Sopenharmony_ci QUERY_PHYS_PARMS_RSP = 0x85, 73062306a36Sopenharmony_ci QUERY_PHYS_CAPABILITIES = 0x06, 73162306a36Sopenharmony_ci QUERY_PHYS_CAPABILITIES_RSP = 0x86, 73262306a36Sopenharmony_ci SET_PHYS_PARMS = 0x07, 73362306a36Sopenharmony_ci SET_PHYS_PARMS_RSP = 0x87, 73462306a36Sopenharmony_ci ERROR_INDICATION = 0x08, 73562306a36Sopenharmony_ci LOGICAL_LINK_STATE = 0x0C, 73662306a36Sopenharmony_ci LOGICAL_LINK_STATE_RSP = 0x8C, 73762306a36Sopenharmony_ci REQUEST_STATISTICS = 0x0D, 73862306a36Sopenharmony_ci REQUEST_STATISTICS_RSP = 0x8D, 73962306a36Sopenharmony_ci COLLECT_FW_TRACE = 0x11, 74062306a36Sopenharmony_ci COLLECT_FW_TRACE_RSP = 0x91, 74162306a36Sopenharmony_ci LINK_STATE_INDICATION = 0x12, 74262306a36Sopenharmony_ci CHANGE_MAC_ADDR = 0x13, 74362306a36Sopenharmony_ci CHANGE_MAC_ADDR_RSP = 0x93, 74462306a36Sopenharmony_ci MULTICAST_CTRL = 0x14, 74562306a36Sopenharmony_ci MULTICAST_CTRL_RSP = 0x94, 74662306a36Sopenharmony_ci GET_VPD_SIZE = 0x15, 74762306a36Sopenharmony_ci GET_VPD_SIZE_RSP = 0x95, 74862306a36Sopenharmony_ci GET_VPD = 0x16, 74962306a36Sopenharmony_ci GET_VPD_RSP = 0x96, 75062306a36Sopenharmony_ci TUNE = 0x17, 75162306a36Sopenharmony_ci TUNE_RSP = 0x97, 75262306a36Sopenharmony_ci QUERY_IP_OFFLOAD = 0x18, 75362306a36Sopenharmony_ci QUERY_IP_OFFLOAD_RSP = 0x98, 75462306a36Sopenharmony_ci CONTROL_IP_OFFLOAD = 0x19, 75562306a36Sopenharmony_ci CONTROL_IP_OFFLOAD_RSP = 0x99, 75662306a36Sopenharmony_ci ACL_CHANGE_INDICATION = 0x1A, 75762306a36Sopenharmony_ci ACL_QUERY = 0x1B, 75862306a36Sopenharmony_ci ACL_QUERY_RSP = 0x9B, 75962306a36Sopenharmony_ci QUERY_MAP = 0x1D, 76062306a36Sopenharmony_ci QUERY_MAP_RSP = 0x9D, 76162306a36Sopenharmony_ci REQUEST_MAP = 0x1E, 76262306a36Sopenharmony_ci REQUEST_MAP_RSP = 0x9E, 76362306a36Sopenharmony_ci REQUEST_UNMAP = 0x1F, 76462306a36Sopenharmony_ci REQUEST_UNMAP_RSP = 0x9F, 76562306a36Sopenharmony_ci VLAN_CTRL = 0x20, 76662306a36Sopenharmony_ci VLAN_CTRL_RSP = 0xA0, 76762306a36Sopenharmony_ci}; 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_cienum ibmvnic_crq_type { 77062306a36Sopenharmony_ci IBMVNIC_CRQ_CMD = 0x80, 77162306a36Sopenharmony_ci IBMVNIC_CRQ_CMD_RSP = 0x80, 77262306a36Sopenharmony_ci IBMVNIC_CRQ_INIT_CMD = 0xC0, 77362306a36Sopenharmony_ci IBMVNIC_CRQ_INIT_RSP = 0xC0, 77462306a36Sopenharmony_ci IBMVNIC_CRQ_XPORT_EVENT = 0xFF, 77562306a36Sopenharmony_ci}; 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_cienum ibmvfc_crq_format { 77862306a36Sopenharmony_ci IBMVNIC_CRQ_INIT = 0x01, 77962306a36Sopenharmony_ci IBMVNIC_CRQ_INIT_COMPLETE = 0x02, 78062306a36Sopenharmony_ci IBMVNIC_PARTITION_MIGRATED = 0x06, 78162306a36Sopenharmony_ci IBMVNIC_DEVICE_FAILOVER = 0x08, 78262306a36Sopenharmony_ci}; 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_cistruct ibmvnic_crq_queue { 78562306a36Sopenharmony_ci union ibmvnic_crq *msgs; 78662306a36Sopenharmony_ci int size, cur; 78762306a36Sopenharmony_ci dma_addr_t msg_token; 78862306a36Sopenharmony_ci /* Used for serialization of msgs, cur */ 78962306a36Sopenharmony_ci spinlock_t lock; 79062306a36Sopenharmony_ci bool active; 79162306a36Sopenharmony_ci char name[32]; 79262306a36Sopenharmony_ci}; 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ciunion sub_crq { 79562306a36Sopenharmony_ci struct ibmvnic_generic_scrq generic; 79662306a36Sopenharmony_ci struct ibmvnic_tx_comp_desc tx_comp; 79762306a36Sopenharmony_ci struct ibmvnic_tx_desc v1; 79862306a36Sopenharmony_ci struct ibmvnic_hdr_desc hdr; 79962306a36Sopenharmony_ci struct ibmvnic_hdr_ext_desc hdr_ext; 80062306a36Sopenharmony_ci struct ibmvnic_sge_desc sge; 80162306a36Sopenharmony_ci struct ibmvnic_rx_comp_desc rx_comp; 80262306a36Sopenharmony_ci struct ibmvnic_rx_buff_add_desc rx_add; 80362306a36Sopenharmony_ci}; 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_cistruct ibmvnic_ind_xmit_queue { 80662306a36Sopenharmony_ci union sub_crq *indir_arr; 80762306a36Sopenharmony_ci dma_addr_t indir_dma; 80862306a36Sopenharmony_ci int index; 80962306a36Sopenharmony_ci}; 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_cistruct ibmvnic_sub_crq_queue { 81262306a36Sopenharmony_ci union sub_crq *msgs; 81362306a36Sopenharmony_ci int size, cur; 81462306a36Sopenharmony_ci dma_addr_t msg_token; 81562306a36Sopenharmony_ci unsigned long crq_num; 81662306a36Sopenharmony_ci unsigned long hw_irq; 81762306a36Sopenharmony_ci unsigned int irq; 81862306a36Sopenharmony_ci unsigned int pool_index; 81962306a36Sopenharmony_ci int scrq_num; 82062306a36Sopenharmony_ci /* Used for serialization of msgs, cur */ 82162306a36Sopenharmony_ci spinlock_t lock; 82262306a36Sopenharmony_ci struct sk_buff *rx_skb_top; 82362306a36Sopenharmony_ci struct ibmvnic_adapter *adapter; 82462306a36Sopenharmony_ci struct ibmvnic_ind_xmit_queue ind_buf; 82562306a36Sopenharmony_ci atomic_t used; 82662306a36Sopenharmony_ci char name[32]; 82762306a36Sopenharmony_ci u64 handle; 82862306a36Sopenharmony_ci cpumask_var_t affinity_mask; 82962306a36Sopenharmony_ci} ____cacheline_aligned; 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_cistruct ibmvnic_long_term_buff { 83262306a36Sopenharmony_ci unsigned char *buff; 83362306a36Sopenharmony_ci dma_addr_t addr; 83462306a36Sopenharmony_ci u64 size; 83562306a36Sopenharmony_ci u8 map_id; 83662306a36Sopenharmony_ci}; 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_cistruct ibmvnic_ltb_set { 83962306a36Sopenharmony_ci int num_ltbs; 84062306a36Sopenharmony_ci struct ibmvnic_long_term_buff *ltbs; 84162306a36Sopenharmony_ci}; 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_cistruct ibmvnic_tx_buff { 84462306a36Sopenharmony_ci struct sk_buff *skb; 84562306a36Sopenharmony_ci int index; 84662306a36Sopenharmony_ci int pool_index; 84762306a36Sopenharmony_ci int num_entries; 84862306a36Sopenharmony_ci}; 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_cistruct ibmvnic_tx_pool { 85162306a36Sopenharmony_ci struct ibmvnic_tx_buff *tx_buff; 85262306a36Sopenharmony_ci int *free_map; 85362306a36Sopenharmony_ci int consumer_index; 85462306a36Sopenharmony_ci int producer_index; 85562306a36Sopenharmony_ci struct ibmvnic_ltb_set ltb_set; 85662306a36Sopenharmony_ci int num_buffers; 85762306a36Sopenharmony_ci int buf_size; 85862306a36Sopenharmony_ci} ____cacheline_aligned; 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_cistruct ibmvnic_rx_buff { 86162306a36Sopenharmony_ci struct sk_buff *skb; 86262306a36Sopenharmony_ci dma_addr_t dma; 86362306a36Sopenharmony_ci unsigned char *data; 86462306a36Sopenharmony_ci int size; 86562306a36Sopenharmony_ci int pool_index; 86662306a36Sopenharmony_ci}; 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_cistruct ibmvnic_rx_pool { 86962306a36Sopenharmony_ci struct ibmvnic_rx_buff *rx_buff; 87062306a36Sopenharmony_ci int size; /* # of buffers in the pool */ 87162306a36Sopenharmony_ci int index; 87262306a36Sopenharmony_ci int buff_size; 87362306a36Sopenharmony_ci atomic_t available; 87462306a36Sopenharmony_ci int *free_map; 87562306a36Sopenharmony_ci int next_free; 87662306a36Sopenharmony_ci int next_alloc; 87762306a36Sopenharmony_ci int active; 87862306a36Sopenharmony_ci struct ibmvnic_ltb_set ltb_set; 87962306a36Sopenharmony_ci} ____cacheline_aligned; 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_cistruct ibmvnic_vpd { 88262306a36Sopenharmony_ci unsigned char *buff; 88362306a36Sopenharmony_ci dma_addr_t dma_addr; 88462306a36Sopenharmony_ci u64 len; 88562306a36Sopenharmony_ci}; 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_cienum vnic_state {VNIC_PROBING = 1, 88862306a36Sopenharmony_ci VNIC_PROBED, 88962306a36Sopenharmony_ci VNIC_OPENING, 89062306a36Sopenharmony_ci VNIC_OPEN, 89162306a36Sopenharmony_ci VNIC_CLOSING, 89262306a36Sopenharmony_ci VNIC_CLOSED, 89362306a36Sopenharmony_ci VNIC_REMOVING, 89462306a36Sopenharmony_ci VNIC_REMOVED, 89562306a36Sopenharmony_ci VNIC_DOWN}; 89662306a36Sopenharmony_ci 89762306a36Sopenharmony_cienum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1, 89862306a36Sopenharmony_ci VNIC_RESET_MOBILITY, 89962306a36Sopenharmony_ci VNIC_RESET_FATAL, 90062306a36Sopenharmony_ci VNIC_RESET_NON_FATAL, 90162306a36Sopenharmony_ci VNIC_RESET_TIMEOUT, 90262306a36Sopenharmony_ci VNIC_RESET_CHANGE_PARAM, 90362306a36Sopenharmony_ci VNIC_RESET_PASSIVE_INIT}; 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_cistruct ibmvnic_rwi { 90662306a36Sopenharmony_ci enum ibmvnic_reset_reason reset_reason; 90762306a36Sopenharmony_ci struct list_head list; 90862306a36Sopenharmony_ci}; 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_cistruct ibmvnic_tunables { 91162306a36Sopenharmony_ci u64 rx_queues; 91262306a36Sopenharmony_ci u64 tx_queues; 91362306a36Sopenharmony_ci u64 rx_entries; 91462306a36Sopenharmony_ci u64 tx_entries; 91562306a36Sopenharmony_ci u64 mtu; 91662306a36Sopenharmony_ci}; 91762306a36Sopenharmony_ci 91862306a36Sopenharmony_cistruct ibmvnic_adapter { 91962306a36Sopenharmony_ci struct vio_dev *vdev; 92062306a36Sopenharmony_ci struct net_device *netdev; 92162306a36Sopenharmony_ci struct ibmvnic_crq_queue crq; 92262306a36Sopenharmony_ci u8 mac_addr[ETH_ALEN]; 92362306a36Sopenharmony_ci struct ibmvnic_query_ip_offload_buffer ip_offload_buf; 92462306a36Sopenharmony_ci dma_addr_t ip_offload_tok; 92562306a36Sopenharmony_ci struct ibmvnic_control_ip_offload_buffer ip_offload_ctrl; 92662306a36Sopenharmony_ci dma_addr_t ip_offload_ctrl_tok; 92762306a36Sopenharmony_ci u32 msg_enable; 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_ci /* Vital Product Data (VPD) */ 93062306a36Sopenharmony_ci struct ibmvnic_vpd *vpd; 93162306a36Sopenharmony_ci char fw_version[32]; 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_ci /* Statistics */ 93462306a36Sopenharmony_ci struct ibmvnic_statistics stats; 93562306a36Sopenharmony_ci dma_addr_t stats_token; 93662306a36Sopenharmony_ci struct completion stats_done; 93762306a36Sopenharmony_ci int replenish_no_mem; 93862306a36Sopenharmony_ci int replenish_add_buff_success; 93962306a36Sopenharmony_ci int replenish_add_buff_failure; 94062306a36Sopenharmony_ci int replenish_task_cycles; 94162306a36Sopenharmony_ci int tx_send_failed; 94262306a36Sopenharmony_ci int tx_map_failed; 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_ci struct ibmvnic_tx_queue_stats *tx_stats_buffers; 94562306a36Sopenharmony_ci struct ibmvnic_rx_queue_stats *rx_stats_buffers; 94662306a36Sopenharmony_ci 94762306a36Sopenharmony_ci int phys_link_state; 94862306a36Sopenharmony_ci int logical_link_state; 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_ci u32 speed; 95162306a36Sopenharmony_ci u8 duplex; 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci /* login data */ 95462306a36Sopenharmony_ci struct ibmvnic_login_buffer *login_buf; 95562306a36Sopenharmony_ci dma_addr_t login_buf_token; 95662306a36Sopenharmony_ci int login_buf_sz; 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_ci struct ibmvnic_login_rsp_buffer *login_rsp_buf; 95962306a36Sopenharmony_ci dma_addr_t login_rsp_buf_token; 96062306a36Sopenharmony_ci int login_rsp_buf_sz; 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_ci atomic_t running_cap_crqs; 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_ci struct ibmvnic_sub_crq_queue **tx_scrq ____cacheline_aligned; 96562306a36Sopenharmony_ci struct ibmvnic_sub_crq_queue **rx_scrq ____cacheline_aligned; 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ci /* rx structs */ 96862306a36Sopenharmony_ci struct napi_struct *napi; 96962306a36Sopenharmony_ci struct ibmvnic_rx_pool *rx_pool; 97062306a36Sopenharmony_ci u64 promisc; 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_ci struct ibmvnic_tx_pool *tx_pool; 97362306a36Sopenharmony_ci struct ibmvnic_tx_pool *tso_pool; 97462306a36Sopenharmony_ci struct completion probe_done; 97562306a36Sopenharmony_ci struct completion init_done; 97662306a36Sopenharmony_ci int init_done_rc; 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_ci struct completion fw_done; 97962306a36Sopenharmony_ci /* Used for serialization of device commands */ 98062306a36Sopenharmony_ci struct mutex fw_lock; 98162306a36Sopenharmony_ci int fw_done_rc; 98262306a36Sopenharmony_ci 98362306a36Sopenharmony_ci struct completion reset_done; 98462306a36Sopenharmony_ci int reset_done_rc; 98562306a36Sopenharmony_ci bool wait_for_reset; 98662306a36Sopenharmony_ci 98762306a36Sopenharmony_ci /* CPU hotplug instances for online & dead */ 98862306a36Sopenharmony_ci struct hlist_node node; 98962306a36Sopenharmony_ci struct hlist_node node_dead; 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_ci /* partner capabilities */ 99262306a36Sopenharmony_ci u64 min_tx_queues; 99362306a36Sopenharmony_ci u64 min_rx_queues; 99462306a36Sopenharmony_ci u64 min_rx_add_queues; 99562306a36Sopenharmony_ci u64 max_tx_queues; 99662306a36Sopenharmony_ci u64 max_rx_queues; 99762306a36Sopenharmony_ci u64 max_rx_add_queues; 99862306a36Sopenharmony_ci u64 req_tx_queues; 99962306a36Sopenharmony_ci u64 req_rx_queues; 100062306a36Sopenharmony_ci u64 req_rx_add_queues; 100162306a36Sopenharmony_ci u64 min_tx_entries_per_subcrq; 100262306a36Sopenharmony_ci u64 min_rx_add_entries_per_subcrq; 100362306a36Sopenharmony_ci u64 max_tx_entries_per_subcrq; 100462306a36Sopenharmony_ci u64 max_rx_add_entries_per_subcrq; 100562306a36Sopenharmony_ci u64 req_tx_entries_per_subcrq; 100662306a36Sopenharmony_ci u64 req_rx_add_entries_per_subcrq; 100762306a36Sopenharmony_ci u64 tcp_ip_offload; 100862306a36Sopenharmony_ci u64 promisc_requested; 100962306a36Sopenharmony_ci u64 promisc_supported; 101062306a36Sopenharmony_ci u64 min_mtu; 101162306a36Sopenharmony_ci u64 max_mtu; 101262306a36Sopenharmony_ci u64 req_mtu; 101362306a36Sopenharmony_ci u64 prev_mtu; 101462306a36Sopenharmony_ci u64 max_multicast_filters; 101562306a36Sopenharmony_ci u64 vlan_header_insertion; 101662306a36Sopenharmony_ci u64 rx_vlan_header_insertion; 101762306a36Sopenharmony_ci u64 max_tx_sg_entries; 101862306a36Sopenharmony_ci u64 rx_sg_supported; 101962306a36Sopenharmony_ci u64 rx_sg_requested; 102062306a36Sopenharmony_ci u64 opt_tx_comp_sub_queues; 102162306a36Sopenharmony_ci u64 opt_rx_comp_queues; 102262306a36Sopenharmony_ci u64 opt_rx_bufadd_q_per_rx_comp_q; 102362306a36Sopenharmony_ci u64 opt_tx_entries_per_subcrq; 102462306a36Sopenharmony_ci u64 opt_rxba_entries_per_subcrq; 102562306a36Sopenharmony_ci __be64 tx_rx_desc_req; 102662306a36Sopenharmony_ci#define MAX_MAP_ID 255 102762306a36Sopenharmony_ci DECLARE_BITMAP(map_ids, MAX_MAP_ID); 102862306a36Sopenharmony_ci u32 num_active_rx_scrqs; 102962306a36Sopenharmony_ci u32 num_active_rx_pools; 103062306a36Sopenharmony_ci u32 num_active_rx_napi; 103162306a36Sopenharmony_ci u32 num_active_tx_scrqs; 103262306a36Sopenharmony_ci u32 num_active_tx_pools; 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_ci u32 prev_rx_pool_size; 103562306a36Sopenharmony_ci u32 prev_tx_pool_size; 103662306a36Sopenharmony_ci u32 cur_rx_buf_sz; 103762306a36Sopenharmony_ci u32 prev_rx_buf_sz; 103862306a36Sopenharmony_ci 103962306a36Sopenharmony_ci struct tasklet_struct tasklet; 104062306a36Sopenharmony_ci enum vnic_state state; 104162306a36Sopenharmony_ci /* Used for serialization of state field. When taking both state 104262306a36Sopenharmony_ci * and rwi locks, take state lock first. 104362306a36Sopenharmony_ci */ 104462306a36Sopenharmony_ci spinlock_t state_lock; 104562306a36Sopenharmony_ci enum ibmvnic_reset_reason reset_reason; 104662306a36Sopenharmony_ci struct list_head rwi_list; 104762306a36Sopenharmony_ci /* Used for serialization of rwi_list. When taking both state 104862306a36Sopenharmony_ci * and rwi locks, take state lock first 104962306a36Sopenharmony_ci */ 105062306a36Sopenharmony_ci spinlock_t rwi_lock; 105162306a36Sopenharmony_ci struct work_struct ibmvnic_reset; 105262306a36Sopenharmony_ci struct delayed_work ibmvnic_delayed_reset; 105362306a36Sopenharmony_ci unsigned long resetting; 105462306a36Sopenharmony_ci /* last device reset time */ 105562306a36Sopenharmony_ci unsigned long last_reset_time; 105662306a36Sopenharmony_ci 105762306a36Sopenharmony_ci bool napi_enabled; 105862306a36Sopenharmony_ci bool from_passive_init; 105962306a36Sopenharmony_ci bool login_pending; 106062306a36Sopenharmony_ci /* protected by rcu */ 106162306a36Sopenharmony_ci bool tx_queues_active; 106262306a36Sopenharmony_ci bool failover_pending; 106362306a36Sopenharmony_ci bool force_reset_recovery; 106462306a36Sopenharmony_ci 106562306a36Sopenharmony_ci struct ibmvnic_tunables desired; 106662306a36Sopenharmony_ci struct ibmvnic_tunables fallback; 106762306a36Sopenharmony_ci}; 1068