Linux Audio

Check our new training course

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