^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /**************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) /* IBM System i and System p Virtual NIC Device Driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /* Copyright (C) 2014 IBM Corp. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) /* Santiago Leon (santi_leon@yahoo.com) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) /* Thomas Falcon (tlfalcon@linux.vnet.ibm.com) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /* John Allen (jallen@linux.vnet.ibm.com) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /* This module contains the implementation of a virtual ethernet device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /* for use with IBM i/pSeries LPAR Linux. It utilizes the logical LAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* option of the RS/6000 Platform Architecture to interface with virtual */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) /* ethernet NICs that are presented to the partition by the hypervisor. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) /* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /**************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define IBMVNIC_NAME "ibmvnic"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define IBMVNIC_DRIVER_VERSION "1.0.1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define IBMVNIC_INVALID_MAP -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define IBMVNIC_STATS_TIMEOUT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define IBMVNIC_INIT_FAILED 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define IBMVNIC_OPEN_FAILED 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /* basic structures plus 100 2k buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define IBMVNIC_IO_ENTITLEMENT_DEFAULT 610305
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* Initial module_parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define IBMVNIC_RX_WEIGHT 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /* when changing this, update IBMVNIC_IO_ENTITLEMENT_DEFAULT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define IBMVNIC_BUFFS_PER_POOL 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define IBMVNIC_MAX_QUEUES 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define IBMVNIC_MAX_QUEUE_SZ 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define IBMVNIC_TSO_BUF_SZ 65536
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define IBMVNIC_TSO_BUFS 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define IBMVNIC_TSO_POOL_MASK 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define IBMVNIC_MAX_LTB_SIZE ((1 << (MAX_ORDER - 1)) * PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define IBMVNIC_BUFFER_HLEN 500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define IBMVNIC_RESET_DELAY 100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static const char ibmvnic_priv_flags[][ETH_GSTRING_LEN] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define IBMVNIC_USE_SERVER_MAXES 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) "use-server-maxes"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct ibmvnic_login_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) __be32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define INITIAL_VERSION_LB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) __be32 num_txcomp_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) __be32 off_txcomp_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) __be32 num_rxcomp_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) __be32 off_rxcomp_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) __be32 login_rsp_ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) __be32 login_rsp_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) __be32 client_data_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) __be32 client_data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct ibmvnic_login_rsp_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) __be32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define INITIAL_VERSION_LRB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) __be32 num_txsubm_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) __be32 off_txsubm_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) __be32 num_rxadd_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) __be32 off_rxadd_subcrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) __be32 off_rxadd_buff_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) __be32 num_supp_tx_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) __be32 off_supp_tx_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct ibmvnic_query_ip_offload_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) __be32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define INITIAL_VERSION_IOB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u8 ipv4_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u8 ipv6_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u8 tcp_ipv4_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u8 tcp_ipv6_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u8 udp_ipv4_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) u8 udp_ipv6_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) u8 large_tx_ipv4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) u8 large_tx_ipv6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u8 large_rx_ipv4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u8 large_rx_ipv6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u8 reserved1[14];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) __be16 max_ipv4_header_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) __be16 max_ipv6_header_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) __be16 max_tcp_header_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) __be16 max_udp_header_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) __be32 max_large_tx_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) __be32 max_large_rx_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) u8 reserved2[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) u8 ipv6_extension_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define IPV6_EH_NOT_SUPPORTED 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define IPV6_EH_SUPPORTED_LIM 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define IPV6_EH_SUPPORTED 0xFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u8 tcp_pseudosum_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define TCP_PS_NOT_REQUIRED 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define TCP_PS_REQUIRED 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) u8 reserved3[30];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) __be16 num_ipv6_ext_headers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) __be32 off_ipv6_ext_headers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) u8 reserved4[154];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct ibmvnic_control_ip_offload_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) __be32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define INITIAL_VERSION_IOB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u8 ipv4_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) u8 ipv6_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u8 tcp_ipv4_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) u8 tcp_ipv6_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) u8 udp_ipv4_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) u8 udp_ipv6_chksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) u8 large_tx_ipv4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) u8 large_tx_ipv6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) u8 bad_packet_rx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) u8 large_rx_ipv4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) u8 large_rx_ipv6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u8 reserved4[111];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct ibmvnic_fw_component {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) u8 name[48];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __be32 trace_buff_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u8 correlator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) u8 trace_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u8 parent_correlator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) u8 error_check_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) u8 trace_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) u8 reserved[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) u8 description[192];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) struct ibmvnic_fw_trace_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) __be32 trace_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) u8 num_valid_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) u8 reserved[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) __be64 pmc_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) __be64 timebase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) __be64 trace_data[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) struct ibmvnic_statistics {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) __be32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) __be32 promiscuous;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) __be64 rx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) __be64 rx_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) __be64 tx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) __be64 tx_bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) __be64 ucast_tx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) __be64 ucast_rx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) __be64 mcast_tx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) __be64 mcast_rx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) __be64 bcast_tx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) __be64 bcast_rx_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) __be64 align_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) __be64 fcs_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) __be64 single_collision_frames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) __be64 multi_collision_frames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) __be64 sqe_test_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) __be64 deferred_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) __be64 late_collisions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) __be64 excess_collisions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) __be64 internal_mac_tx_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) __be64 carrier_sense;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) __be64 too_long_frames;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) __be64 internal_mac_rx_errors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) u8 reserved[72];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define NUM_TX_STATS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) struct ibmvnic_tx_queue_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) u64 packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) u64 bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) u64 dropped_packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define NUM_RX_STATS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct ibmvnic_rx_queue_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) u64 packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) u64 bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) u64 interrupts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct ibmvnic_acl_buffer {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) __be32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) #define INITIAL_VERSION_IOB 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) u8 mac_acls_restrict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) u8 vlan_acls_restrict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) u8 reserved1[22];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) __be32 num_mac_addrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) __be32 offset_mac_addrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) __be32 num_vlan_ids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) __be32 offset_vlan_ids;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) u8 reserved2[80];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) /* descriptors have been changed, how should this be defined? 1? 4? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) #define IBMVNIC_TX_DESC_VERSIONS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /* is this still needed? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct ibmvnic_tx_comp_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) u8 num_comps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) __be16 rcs[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) __be32 correlators[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /* some flags that included in v0 descriptor, which is gone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) * only used for IBMVNIC_TCP_CHKSUM and IBMVNIC_UDP_CHKSUM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * and only in some offload_flags variable that doesn't seem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * to be used anywhere, can probably be removed?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) #define IBMVNIC_TCP_CHKSUM 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define IBMVNIC_UDP_CHKSUM 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) #define IBMVNIC_MAX_FRAGS_PER_CRQ 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) struct ibmvnic_tx_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define IBMVNIC_TX_DESC 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) u8 n_crq_elem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) u8 n_sge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) u8 flags1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) #define IBMVNIC_TX_COMP_NEEDED 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define IBMVNIC_TX_CHKSUM_OFFLOAD 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #define IBMVNIC_TX_LSO 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define IBMVNIC_TX_PROT_TCP 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) #define IBMVNIC_TX_PROT_UDP 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define IBMVNIC_TX_PROT_IPV4 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) #define IBMVNIC_TX_PROT_IPV6 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) #define IBMVNIC_TX_VLAN_PRESENT 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) u8 flags2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define IBMVNIC_TX_VLAN_INSERT 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) __be16 mss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) u8 reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) __be32 correlator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) __be16 vlan_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) __be16 dma_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) __be32 sge_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) __be64 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) struct ibmvnic_hdr_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define IBMVNIC_HDR_DESC 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) u8 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) u8 l2_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) __be16 l3_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) u8 l4_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) u8 flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) u8 data[24];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) struct ibmvnic_hdr_ext_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define IBMVNIC_HDR_EXT_DESC 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) u8 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) u8 data[29];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) struct ibmvnic_sge_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u8 type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #define IBMVNIC_SGE_DESC 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) __be16 sge1_dma_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) __be32 sge1_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) __be64 sge1_ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) __be16 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) __be16 sge2_dma_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) __be32 sge2_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) __be64 sge2_ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct ibmvnic_rx_comp_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define IBMVNIC_IP_CHKSUM_GOOD 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define IBMVNIC_TCP_UDP_CHKSUM_GOOD 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define IBMVNIC_END_FRAME 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define IBMVNIC_EXACT_MC 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define IBMVNIC_VLAN_STRIPPED 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) __be16 off_frame_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) __be64 correlator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) __be16 vlan_tci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) __be16 rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) u8 reserved[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) struct ibmvnic_generic_scrq {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) u8 reserved[31];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) struct ibmvnic_rx_buff_add_desc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) u8 reserved[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) __be64 correlator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) u8 map_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) __be32 len:24;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) u8 reserved2[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) struct ibmvnic_rc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) u8 code; /* one of enum ibmvnic_rc_codes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) u8 detailed_data[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) } __packed __aligned(4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) struct ibmvnic_generic_crq {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) u8 params[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) struct ibmvnic_version_exchange {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) __be16 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #define IBMVNIC_INITIAL_VERSION 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) u8 reserved[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) struct ibmvnic_capability {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) __be16 capability; /* one of ibmvnic_capabilities */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) __be64 number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) struct ibmvnic_login {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) u8 reserved[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct ibmvnic_phys_parms {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) u8 flags1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #define IBMVNIC_EXTERNAL_LOOPBACK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define IBMVNIC_INTERNAL_LOOPBACK 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define IBMVNIC_PROMISC 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) #define IBMVNIC_PHYS_LINK_ACTIVE 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #define IBMVNIC_AUTONEG_DUPLEX 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) #define IBMVNIC_FULL_DUPLEX 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) #define IBMVNIC_HALF_DUPLEX 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) #define IBMVNIC_CAN_CHG_PHYS_PARMS 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) u8 flags2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) #define IBMVNIC_LOGICAL_LNK_ACTIVE 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) __be32 speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #define IBMVNIC_AUTONEG 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) #define IBMVNIC_10MBPS 0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #define IBMVNIC_100MBPS 0x20000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) #define IBMVNIC_1GBPS 0x10000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) #define IBMVNIC_10GBPS 0x08000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) #define IBMVNIC_40GBPS 0x04000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) #define IBMVNIC_100GBPS 0x02000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) #define IBMVNIC_25GBPS 0x01000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #define IBMVNIC_50GBPS 0x00800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) #define IBMVNIC_200GBPS 0x00400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) __be32 mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) struct ibmvnic_logical_link_state {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) u8 link_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #define IBMVNIC_LOGICAL_LNK_DN 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #define IBMVNIC_LOGICAL_LNK_UP 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #define IBMVNIC_LOGICAL_LNK_QUERY 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) u8 reserved[9];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct ibmvnic_query_ip_offload {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) u8 reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) struct ibmvnic_control_ip_offload {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) u8 reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) struct ibmvnic_request_dump_size {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) u8 reserved[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) struct ibmvnic_request_dump {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) u8 reserved1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) u8 reserved2[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) struct ibmvnic_request_dump_rsp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) u8 reserved[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) __be32 dumped_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) struct ibmvnic_request_ras_comp_num {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) u8 reserved1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) __be32 num_components;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) u8 reserved2[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) struct ibmvnic_request_ras_comps {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) u8 reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) struct ibmvnic_control_ras {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) u8 correlator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) u8 level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) u8 op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) #define IBMVNIC_TRACE_LEVEL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) #define IBMVNIC_ERROR_LEVEL 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) #define IBMVNIC_TRACE_PAUSE 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) #define IBMVNIC_TRACE_RESUME 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) #define IBMVNIC_TRACE_ON 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) #define IBMVNIC_TRACE_OFF 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) #define IBMVNIC_CHG_TRACE_BUFF_SZ 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) u8 trace_buff_sz[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) u8 reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) struct ibmvnic_collect_fw_trace {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) u8 correlator;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) u8 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) struct ibmvnic_request_statistics {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) #define IBMVNIC_PHYSICAL_PORT 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) u8 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) u8 reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) struct ibmvnic_request_debug_stats {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) u8 reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) struct ibmvnic_error_indication {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) #define IBMVNIC_FATAL_ERROR 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) u8 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) __be32 error_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) __be32 detail_error_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) __be16 error_cause;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) u8 reserved2[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) struct ibmvnic_link_state_indication {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) u8 reserved1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) u8 phys_link_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) u8 logical_link_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) u8 reserved2[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) struct ibmvnic_change_mac_addr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) u8 mac_addr[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) u8 reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) struct ibmvnic_multicast_ctrl {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) u8 mac_addr[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) #define IBMVNIC_ENABLE_MC 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) #define IBMVNIC_DISABLE_MC 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) #define IBMVNIC_ENABLE_ALL 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) #define IBMVNIC_DISABLE_ALL 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) u8 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) __be16 reserved2; /* was num_enabled_mc_addr; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) struct ibmvnic_get_vpd_size {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) u8 reserved[14];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) struct ibmvnic_get_vpd_size_rsp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) u8 reserved[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) __be64 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) struct ibmvnic_get_vpd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) u8 reserved1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) u8 reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) struct ibmvnic_get_vpd_rsp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) u8 reserved[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct ibmvnic_acl_change_indication {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) __be16 change_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) #define IBMVNIC_MAC_ACL 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) #define IBMVNIC_VLAN_ACL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) u8 reserved[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) struct ibmvnic_acl_query {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) u8 reserved1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) u8 reserved2[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) struct ibmvnic_tune {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) u8 reserved1[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) u8 reserved2[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) struct ibmvnic_request_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) u8 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) u8 map_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) __be32 ioba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) __be32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) u8 reserved2[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) struct ibmvnic_request_map_rsp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) u8 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) u8 map_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) u8 reserved2[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct ibmvnic_request_unmap {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) u8 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) u8 map_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) u8 reserved2[12];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) struct ibmvnic_request_unmap_rsp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) u8 reserved1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) u8 map_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) u8 reserved2[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) struct ibmvnic_query_map {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) u8 reserved[14];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) struct ibmvnic_query_map_rsp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) u8 first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) u8 cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) u8 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) u8 page_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) __be32 tot_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) __be32 free_pages;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) struct ibmvnic_rc rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) } __packed __aligned(8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) union ibmvnic_crq {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) struct ibmvnic_generic_crq generic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) struct ibmvnic_version_exchange version_exchange;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) struct ibmvnic_version_exchange version_exchange_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) struct ibmvnic_capability query_capability;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) struct ibmvnic_capability query_capability_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) struct ibmvnic_capability request_capability;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) struct ibmvnic_capability request_capability_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) struct ibmvnic_login login;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) struct ibmvnic_generic_crq login_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) struct ibmvnic_phys_parms query_phys_parms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) struct ibmvnic_phys_parms query_phys_parms_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) struct ibmvnic_phys_parms query_phys_capabilities;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) struct ibmvnic_phys_parms query_phys_capabilities_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) struct ibmvnic_phys_parms set_phys_parms;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) struct ibmvnic_phys_parms set_phys_parms_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) struct ibmvnic_logical_link_state logical_link_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) struct ibmvnic_logical_link_state logical_link_state_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) struct ibmvnic_query_ip_offload query_ip_offload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct ibmvnic_query_ip_offload query_ip_offload_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) struct ibmvnic_control_ip_offload control_ip_offload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct ibmvnic_control_ip_offload control_ip_offload_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct ibmvnic_request_dump_size request_dump_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct ibmvnic_request_dump_size request_dump_size_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) struct ibmvnic_request_dump request_dump;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) struct ibmvnic_request_dump_rsp request_dump_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) struct ibmvnic_request_ras_comp_num request_ras_comp_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) struct ibmvnic_request_ras_comp_num request_ras_comp_num_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) struct ibmvnic_request_ras_comps request_ras_comps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) struct ibmvnic_request_ras_comps request_ras_comps_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) struct ibmvnic_control_ras control_ras;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) struct ibmvnic_control_ras control_ras_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) struct ibmvnic_collect_fw_trace collect_fw_trace;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) struct ibmvnic_collect_fw_trace collect_fw_trace_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) struct ibmvnic_request_statistics request_statistics;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) struct ibmvnic_generic_crq request_statistics_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) struct ibmvnic_request_debug_stats request_debug_stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) struct ibmvnic_request_debug_stats request_debug_stats_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) struct ibmvnic_error_indication error_indication;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) struct ibmvnic_link_state_indication link_state_indication;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) struct ibmvnic_change_mac_addr change_mac_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) struct ibmvnic_change_mac_addr change_mac_addr_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) struct ibmvnic_multicast_ctrl multicast_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) struct ibmvnic_multicast_ctrl multicast_ctrl_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) struct ibmvnic_get_vpd_size get_vpd_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) struct ibmvnic_get_vpd_size_rsp get_vpd_size_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) struct ibmvnic_get_vpd get_vpd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) struct ibmvnic_get_vpd_rsp get_vpd_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) struct ibmvnic_acl_change_indication acl_change_indication;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) struct ibmvnic_acl_query acl_query;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) struct ibmvnic_generic_crq acl_query_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) struct ibmvnic_tune tune;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) struct ibmvnic_generic_crq tune_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) struct ibmvnic_request_map request_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) struct ibmvnic_request_map_rsp request_map_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) struct ibmvnic_request_unmap request_unmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) struct ibmvnic_request_unmap_rsp request_unmap_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) struct ibmvnic_query_map query_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) struct ibmvnic_query_map_rsp query_map_rsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) enum ibmvnic_rc_codes {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) SUCCESS = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) PARTIALSUCCESS = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) PERMISSION = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) NOMEMORY = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) PARAMETER = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) UNKNOWNCOMMAND = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) ABORTED = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) INVALIDSTATE = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) INVALIDIOBA = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) INVALIDLENGTH = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) UNSUPPORTEDOPTION = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) enum ibmvnic_capabilities {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) MIN_TX_QUEUES = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) MIN_RX_QUEUES = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) MIN_RX_ADD_QUEUES = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) MAX_TX_QUEUES = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) MAX_RX_QUEUES = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) MAX_RX_ADD_QUEUES = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) REQ_TX_QUEUES = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) REQ_RX_QUEUES = 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) REQ_RX_ADD_QUEUES = 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) MIN_TX_ENTRIES_PER_SUBCRQ = 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) MIN_RX_ADD_ENTRIES_PER_SUBCRQ = 11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) MAX_TX_ENTRIES_PER_SUBCRQ = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) MAX_RX_ADD_ENTRIES_PER_SUBCRQ = 13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) REQ_TX_ENTRIES_PER_SUBCRQ = 14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) REQ_RX_ADD_ENTRIES_PER_SUBCRQ = 15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) TCP_IP_OFFLOAD = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) PROMISC_REQUESTED = 17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) PROMISC_SUPPORTED = 18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) MIN_MTU = 19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) MAX_MTU = 20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) REQ_MTU = 21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) MAX_MULTICAST_FILTERS = 22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) VLAN_HEADER_INSERTION = 23,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) RX_VLAN_HEADER_INSERTION = 24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) MAX_TX_SG_ENTRIES = 25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) RX_SG_SUPPORTED = 26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) RX_SG_REQUESTED = 27,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) OPT_TX_COMP_SUB_QUEUES = 28,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) OPT_RX_COMP_QUEUES = 29,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) OPT_RX_BUFADD_Q_PER_RX_COMP_Q = 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) OPT_TX_ENTRIES_PER_SUBCRQ = 31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) OPT_RXBA_ENTRIES_PER_SUBCRQ = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) TX_RX_DESC_REQ = 33,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) enum ibmvnic_error_cause {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) ADAPTER_PROBLEM = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) BUS_PROBLEM = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) FW_PROBLEM = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) DD_PROBLEM = 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) EEH_RECOVERY = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) FW_UPDATED = 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) LOW_MEMORY = 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) enum ibmvnic_commands {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) VERSION_EXCHANGE = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) VERSION_EXCHANGE_RSP = 0x81,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) QUERY_CAPABILITY = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) QUERY_CAPABILITY_RSP = 0x82,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) REQUEST_CAPABILITY = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) REQUEST_CAPABILITY_RSP = 0x83,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) LOGIN = 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) LOGIN_RSP = 0x84,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) QUERY_PHYS_PARMS = 0x05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) QUERY_PHYS_PARMS_RSP = 0x85,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) QUERY_PHYS_CAPABILITIES = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) QUERY_PHYS_CAPABILITIES_RSP = 0x86,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) SET_PHYS_PARMS = 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) SET_PHYS_PARMS_RSP = 0x87,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) ERROR_INDICATION = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) LOGICAL_LINK_STATE = 0x0C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) LOGICAL_LINK_STATE_RSP = 0x8C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) REQUEST_STATISTICS = 0x0D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) REQUEST_STATISTICS_RSP = 0x8D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) COLLECT_FW_TRACE = 0x11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) COLLECT_FW_TRACE_RSP = 0x91,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) LINK_STATE_INDICATION = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) CHANGE_MAC_ADDR = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) CHANGE_MAC_ADDR_RSP = 0x93,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) MULTICAST_CTRL = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) MULTICAST_CTRL_RSP = 0x94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) GET_VPD_SIZE = 0x15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) GET_VPD_SIZE_RSP = 0x95,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) GET_VPD = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) GET_VPD_RSP = 0x96,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) TUNE = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) TUNE_RSP = 0x97,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) QUERY_IP_OFFLOAD = 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) QUERY_IP_OFFLOAD_RSP = 0x98,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) CONTROL_IP_OFFLOAD = 0x19,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) CONTROL_IP_OFFLOAD_RSP = 0x99,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) ACL_CHANGE_INDICATION = 0x1A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) ACL_QUERY = 0x1B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) ACL_QUERY_RSP = 0x9B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) QUERY_MAP = 0x1D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) QUERY_MAP_RSP = 0x9D,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) REQUEST_MAP = 0x1E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) REQUEST_MAP_RSP = 0x9E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) REQUEST_UNMAP = 0x1F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) REQUEST_UNMAP_RSP = 0x9F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) VLAN_CTRL = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) VLAN_CTRL_RSP = 0xA0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) enum ibmvnic_crq_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) IBMVNIC_CRQ_CMD = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) IBMVNIC_CRQ_CMD_RSP = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) IBMVNIC_CRQ_INIT_CMD = 0xC0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) IBMVNIC_CRQ_INIT_RSP = 0xC0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) IBMVNIC_CRQ_XPORT_EVENT = 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) enum ibmvfc_crq_format {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) IBMVNIC_CRQ_INIT = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) IBMVNIC_CRQ_INIT_COMPLETE = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) IBMVNIC_PARTITION_MIGRATED = 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) IBMVNIC_DEVICE_FAILOVER = 0x08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) struct ibmvnic_crq_queue {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) union ibmvnic_crq *msgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) int size, cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) dma_addr_t msg_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) bool active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) char name[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) union sub_crq {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) struct ibmvnic_generic_scrq generic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) struct ibmvnic_tx_comp_desc tx_comp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) struct ibmvnic_tx_desc v1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) struct ibmvnic_hdr_desc hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) struct ibmvnic_hdr_ext_desc hdr_ext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) struct ibmvnic_sge_desc sge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) struct ibmvnic_rx_comp_desc rx_comp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) struct ibmvnic_rx_buff_add_desc rx_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) struct ibmvnic_sub_crq_queue {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) union sub_crq *msgs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) int size, cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) dma_addr_t msg_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) unsigned long crq_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) unsigned long hw_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) unsigned int irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) unsigned int pool_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) int scrq_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) struct sk_buff *rx_skb_top;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) struct ibmvnic_adapter *adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) atomic_t used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) char name[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) u64 handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) struct ibmvnic_long_term_buff {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) unsigned char *buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) dma_addr_t addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) u64 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) u8 map_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) struct ibmvnic_tx_buff {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) dma_addr_t data_dma[IBMVNIC_MAX_FRAGS_PER_CRQ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) unsigned int data_len[IBMVNIC_MAX_FRAGS_PER_CRQ];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) int pool_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) bool last_frag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) union sub_crq indir_arr[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) u8 hdr_data[140];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) dma_addr_t indir_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) int num_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) struct ibmvnic_tx_pool {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) struct ibmvnic_tx_buff *tx_buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) int *free_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) int consumer_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) int producer_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) struct ibmvnic_long_term_buff long_term_buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) int num_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) int buf_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) struct ibmvnic_rx_buff {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) dma_addr_t dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) unsigned char *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) int pool_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) struct ibmvnic_rx_pool {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) struct ibmvnic_rx_buff *rx_buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) int size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) int buff_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) atomic_t available;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) int *free_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) int next_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) int next_alloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) int active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) struct ibmvnic_long_term_buff long_term_buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) struct ibmvnic_vpd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) unsigned char *buff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) dma_addr_t dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) u64 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) enum vnic_state {VNIC_PROBING = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) VNIC_PROBED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) VNIC_OPENING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) VNIC_OPEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) VNIC_CLOSING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) VNIC_CLOSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) VNIC_REMOVING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) VNIC_REMOVED};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) enum ibmvnic_reset_reason {VNIC_RESET_FAILOVER = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) VNIC_RESET_MOBILITY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) VNIC_RESET_FATAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) VNIC_RESET_NON_FATAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) VNIC_RESET_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) VNIC_RESET_CHANGE_PARAM};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) struct ibmvnic_rwi {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) enum ibmvnic_reset_reason reset_reason;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) struct ibmvnic_tunables {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) u64 rx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) u64 tx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) u64 rx_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) u64 tx_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) u64 mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) struct ibmvnic_adapter {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) struct vio_dev *vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) struct net_device *netdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) struct ibmvnic_crq_queue crq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) u8 mac_addr[ETH_ALEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) struct ibmvnic_query_ip_offload_buffer ip_offload_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) dma_addr_t ip_offload_tok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) struct ibmvnic_control_ip_offload_buffer ip_offload_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) dma_addr_t ip_offload_ctrl_tok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) u32 msg_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) u32 priv_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) /* Vital Product Data (VPD) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) struct ibmvnic_vpd *vpd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) char fw_version[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) /* Statistics */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) struct ibmvnic_statistics stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) dma_addr_t stats_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) struct completion stats_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) spinlock_t stats_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) int replenish_no_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) int replenish_add_buff_success;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) int replenish_add_buff_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) int replenish_task_cycles;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) int tx_send_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) int tx_map_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) struct ibmvnic_tx_queue_stats *tx_stats_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) struct ibmvnic_rx_queue_stats *rx_stats_buffers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) int phys_link_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) int logical_link_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) u32 speed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) u8 duplex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) /* login data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) struct ibmvnic_login_buffer *login_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) dma_addr_t login_buf_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) int login_buf_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) struct ibmvnic_login_rsp_buffer *login_rsp_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) dma_addr_t login_rsp_buf_token;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) int login_rsp_buf_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) atomic_t running_cap_crqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) bool wait_capability;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) struct ibmvnic_sub_crq_queue **tx_scrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) struct ibmvnic_sub_crq_queue **rx_scrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) /* rx structs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) struct napi_struct *napi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) struct ibmvnic_rx_pool *rx_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) u64 promisc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) struct ibmvnic_tx_pool *tx_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) struct ibmvnic_tx_pool *tso_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) struct completion init_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) int init_done_rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) struct completion fw_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) /* Used for serialization of device commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) struct mutex fw_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) int fw_done_rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) struct completion reset_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) int reset_done_rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) bool wait_for_reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) /* partner capabilities */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) u64 min_tx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) u64 min_rx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) u64 min_rx_add_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) u64 max_tx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) u64 max_rx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) u64 max_rx_add_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) u64 req_tx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) u64 req_rx_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) u64 req_rx_add_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) u64 min_tx_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) u64 min_rx_add_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) u64 max_tx_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) u64 max_rx_add_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) u64 req_tx_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) u64 req_rx_add_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) u64 tcp_ip_offload;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) u64 promisc_requested;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) u64 promisc_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) u64 min_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) u64 max_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) u64 req_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) u64 max_multicast_filters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) u64 vlan_header_insertion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) u64 rx_vlan_header_insertion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) u64 max_tx_sg_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) u64 rx_sg_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) u64 rx_sg_requested;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) u64 opt_tx_comp_sub_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) u64 opt_rx_comp_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) u64 opt_rx_bufadd_q_per_rx_comp_q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) u64 opt_tx_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) u64 opt_rxba_entries_per_subcrq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) __be64 tx_rx_desc_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) u8 map_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) u32 num_active_rx_scrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) u32 num_active_rx_pools;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) u32 num_active_rx_napi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) u32 num_active_tx_scrqs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) u32 num_active_tx_pools;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) u32 cur_rx_buf_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) struct tasklet_struct tasklet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) enum vnic_state state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) enum ibmvnic_reset_reason reset_reason;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) /* when taking both state and rwi locks, take state lock first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) spinlock_t rwi_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) struct list_head rwi_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) struct work_struct ibmvnic_reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) struct delayed_work ibmvnic_delayed_reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) unsigned long resetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) bool napi_enabled, from_passive_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) bool login_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) /* last device reset time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) unsigned long last_reset_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) bool failover_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) bool force_reset_recovery;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) struct ibmvnic_tunables desired;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) struct ibmvnic_tunables fallback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) /* Used for serialization of state field. When taking both state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) * and rwi locks, take state lock first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) spinlock_t state_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) };