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