linux/drivers/net/ethernet/ibm/ibmvnic.h
<<
>>
Prefs
   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};
1045