linux/drivers/net/ethernet/cavium/liquidio/liquidio_common.h
<<
>>
Prefs
   1/**********************************************************************
   2* Author: Cavium, Inc.
   3*
   4* Contact: support@cavium.com
   5*          Please include "LiquidIO" in the subject.
   6*
   7* Copyright (c) 2003-2015 Cavium, Inc.
   8*
   9* This file is free software; you can redistribute it and/or modify
  10* it under the terms of the GNU General Public License, Version 2, as
  11* published by the Free Software Foundation.
  12*
  13* This file is distributed in the hope that it will be useful, but
  14* AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
  15* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
  16* NONINFRINGEMENT.  See the GNU General Public License for more
  17* details.
  18*
  19* This file may also be available under a different license from Cavium.
  20* Contact Cavium, Inc. for more information
  21**********************************************************************/
  22
  23/*!  \file  liquidio_common.h
  24 *   \brief Common: Structures and macros used in PCI-NIC package by core and
  25 *   host driver.
  26 */
  27
  28#ifndef __LIQUIDIO_COMMON_H__
  29#define __LIQUIDIO_COMMON_H__
  30
  31#include "octeon_config.h"
  32
  33#define LIQUIDIO_BASE_VERSION   "1.4"
  34#define LIQUIDIO_MICRO_VERSION  ".1"
  35#define LIQUIDIO_PACKAGE ""
  36#define LIQUIDIO_VERSION  "1.4.1"
  37
  38#define CONTROL_IQ 0
  39/** Tag types used by Octeon cores in its work. */
  40enum octeon_tag_type {
  41        ORDERED_TAG = 0,
  42        ATOMIC_TAG = 1,
  43        NULL_TAG = 2,
  44        NULL_NULL_TAG = 3
  45};
  46
  47/* pre-defined host->NIC tag values */
  48#define LIO_CONTROL  (0x11111110)
  49#define LIO_DATA(i)  (0x11111111 + (i))
  50
  51/* Opcodes used by host driver/apps to perform operations on the core.
  52 * These are used to identify the major subsystem that the operation
  53 * is for.
  54 */
  55#define OPCODE_CORE 0           /* used for generic core operations */
  56#define OPCODE_NIC  1           /* used for NIC operations */
  57#define OPCODE_LAST OPCODE_NIC
  58
  59/* Subcodes are used by host driver/apps to identify the sub-operation
  60 * for the core. They only need to by unique for a given subsystem.
  61 */
  62#define OPCODE_SUBCODE(op, sub)       (((op & 0x0f) << 8) | ((sub) & 0x7f))
  63
  64/** OPCODE_CORE subcodes. For future use. */
  65
  66/** OPCODE_NIC subcodes */
  67
  68/* This subcode is sent by core PCI driver to indicate cores are ready. */
  69#define OPCODE_NIC_CORE_DRV_ACTIVE     0x01
  70#define OPCODE_NIC_NW_DATA             0x02     /* network packet data */
  71#define OPCODE_NIC_CMD                 0x03
  72#define OPCODE_NIC_INFO                0x04
  73#define OPCODE_NIC_PORT_STATS          0x05
  74#define OPCODE_NIC_MDIO45              0x06
  75#define OPCODE_NIC_TIMESTAMP           0x07
  76#define OPCODE_NIC_INTRMOD_CFG         0x08
  77#define OPCODE_NIC_IF_CFG              0x09
  78
  79#define CORE_DRV_TEST_SCATTER_OP    0xFFF5
  80
  81#define OPCODE_SLOW_PATH(rh)  \
  82        (OPCODE_SUBCODE(rh->r.opcode, rh->r.subcode) != \
  83                OPCODE_SUBCODE(OPCODE_NIC, OPCODE_NIC_NW_DATA))
  84
  85/* Application codes advertised by the core driver initialization packet. */
  86#define CVM_DRV_APP_START           0x0
  87#define CVM_DRV_NO_APP              0
  88#define CVM_DRV_APP_COUNT           0x2
  89#define CVM_DRV_BASE_APP            (CVM_DRV_APP_START + 0x0)
  90#define CVM_DRV_NIC_APP             (CVM_DRV_APP_START + 0x1)
  91#define CVM_DRV_INVALID_APP         (CVM_DRV_APP_START + 0x2)
  92#define CVM_DRV_APP_END             (CVM_DRV_INVALID_APP - 1)
  93
  94/* Macro to increment index.
  95 * Index is incremented by count; if the sum exceeds
  96 * max, index is wrapped-around to the start.
  97 */
  98#define INCR_INDEX(index, count, max)                \
  99do {                                                 \
 100        if (((index) + (count)) >= (max))            \
 101                index = ((index) + (count)) - (max); \
 102        else                                         \
 103                index += (count);                    \
 104} while (0)
 105
 106#define INCR_INDEX_BY1(index, max)      \
 107do {                                    \
 108        if ((++(index)) == (max))       \
 109                index = 0;              \
 110} while (0)
 111
 112#define DECR_INDEX(index, count, max)                  \
 113do {                                                   \
 114        if ((count) > (index))                         \
 115                index = ((max) - ((count - index)));   \
 116        else                                           \
 117                index -= count;                        \
 118} while (0)
 119
 120#define OCT_BOARD_NAME 32
 121#define OCT_SERIAL_LEN 64
 122
 123/* Structure used by core driver to send indication that the Octeon
 124 * application is ready.
 125 */
 126struct octeon_core_setup {
 127        u64 corefreq;
 128
 129        char boardname[OCT_BOARD_NAME];
 130
 131        char board_serial_number[OCT_SERIAL_LEN];
 132
 133        u64 board_rev_major;
 134
 135        u64 board_rev_minor;
 136
 137};
 138
 139/*---------------------------  SCATTER GATHER ENTRY  -----------------------*/
 140
 141/* The Scatter-Gather List Entry. The scatter or gather component used with
 142 * a Octeon input instruction has this format.
 143 */
 144struct octeon_sg_entry {
 145        /** The first 64 bit gives the size of data in each dptr.*/
 146        union {
 147                u16 size[4];
 148                u64 size64;
 149        } u;
 150
 151        /** The 4 dptr pointers for this entry. */
 152        u64 ptr[4];
 153
 154};
 155
 156#define OCT_SG_ENTRY_SIZE    (sizeof(struct octeon_sg_entry))
 157
 158/* \brief Add size to gather list
 159 * @param sg_entry scatter/gather entry
 160 * @param size size to add
 161 * @param pos position to add it.
 162 */
 163static inline void add_sg_size(struct octeon_sg_entry *sg_entry,
 164                               u16 size,
 165                               u32 pos)
 166{
 167#ifdef __BIG_ENDIAN_BITFIELD
 168        sg_entry->u.size[pos] = size;
 169#else
 170        sg_entry->u.size[3 - pos] = size;
 171#endif
 172}
 173
 174/*------------------------- End Scatter/Gather ---------------------------*/
 175
 176#define   OCTNET_FRM_PTP_HEADER_SIZE  8
 177
 178#define   OCTNET_FRM_HEADER_SIZE     22 /* VLAN + Ethernet */
 179
 180#define   OCTNET_MIN_FRM_SIZE        64
 181
 182#define   OCTNET_MAX_FRM_SIZE        (16000 + OCTNET_FRM_HEADER_SIZE)
 183
 184#define   OCTNET_DEFAULT_FRM_SIZE    (1500 + OCTNET_FRM_HEADER_SIZE)
 185
 186/** NIC Commands are sent using this Octeon Input Queue */
 187#define   OCTNET_CMD_Q                0
 188
 189/* NIC Command types */
 190#define   OCTNET_CMD_CHANGE_MTU       0x1
 191#define   OCTNET_CMD_CHANGE_MACADDR   0x2
 192#define   OCTNET_CMD_CHANGE_DEVFLAGS  0x3
 193#define   OCTNET_CMD_RX_CTL           0x4
 194
 195#define   OCTNET_CMD_SET_MULTI_LIST   0x5
 196#define   OCTNET_CMD_CLEAR_STATS      0x6
 197
 198/* command for setting the speed, duplex & autoneg */
 199#define   OCTNET_CMD_SET_SETTINGS     0x7
 200#define   OCTNET_CMD_SET_FLOW_CTL     0x8
 201
 202#define   OCTNET_CMD_MDIO_READ_WRITE  0x9
 203#define   OCTNET_CMD_GPIO_ACCESS      0xA
 204#define   OCTNET_CMD_LRO_ENABLE       0xB
 205#define   OCTNET_CMD_LRO_DISABLE      0xC
 206#define   OCTNET_CMD_SET_RSS          0xD
 207#define   OCTNET_CMD_WRITE_SA         0xE
 208#define   OCTNET_CMD_DELETE_SA        0xF
 209#define   OCTNET_CMD_UPDATE_SA        0x12
 210
 211#define   OCTNET_CMD_TNL_RX_CSUM_CTL 0x10
 212#define   OCTNET_CMD_TNL_TX_CSUM_CTL 0x11
 213#define   OCTNET_CMD_IPSECV2_AH_ESP_CTL 0x13
 214#define   OCTNET_CMD_VERBOSE_ENABLE   0x14
 215#define   OCTNET_CMD_VERBOSE_DISABLE  0x15
 216
 217#define   OCTNET_CMD_ENABLE_VLAN_FILTER 0x16
 218#define   OCTNET_CMD_ADD_VLAN_FILTER  0x17
 219#define   OCTNET_CMD_DEL_VLAN_FILTER  0x18
 220#define   OCTNET_CMD_VXLAN_PORT_CONFIG 0x19
 221#define   OCTNET_CMD_VXLAN_PORT_ADD    0x0
 222#define   OCTNET_CMD_VXLAN_PORT_DEL    0x1
 223#define   OCTNET_CMD_RXCSUM_ENABLE     0x0
 224#define   OCTNET_CMD_RXCSUM_DISABLE    0x1
 225#define   OCTNET_CMD_TXCSUM_ENABLE     0x0
 226#define   OCTNET_CMD_TXCSUM_DISABLE    0x1
 227
 228/* RX(packets coming from wire) Checksum verification flags */
 229/* TCP/UDP csum */
 230#define   CNNIC_L4SUM_VERIFIED             0x1
 231#define   CNNIC_IPSUM_VERIFIED             0x2
 232#define   CNNIC_TUN_CSUM_VERIFIED          0x4
 233#define   CNNIC_CSUM_VERIFIED (CNNIC_IPSUM_VERIFIED | CNNIC_L4SUM_VERIFIED)
 234
 235/*LROIPV4 and LROIPV6 Flags*/
 236#define   OCTNIC_LROIPV4    0x1
 237#define   OCTNIC_LROIPV6    0x2
 238
 239/* Interface flags communicated between host driver and core app. */
 240enum octnet_ifflags {
 241        OCTNET_IFFLAG_PROMISC   = 0x01,
 242        OCTNET_IFFLAG_ALLMULTI  = 0x02,
 243        OCTNET_IFFLAG_MULTICAST = 0x04,
 244        OCTNET_IFFLAG_BROADCAST = 0x08,
 245        OCTNET_IFFLAG_UNICAST   = 0x10
 246};
 247
 248/*   wqe
 249 *  ---------------  0
 250 * |  wqe  word0-3 |
 251 *  ---------------  32
 252 * |    PCI IH     |
 253 *  ---------------  40
 254 * |     RPTR      |
 255 *  ---------------  48
 256 * |    PCI IRH    |
 257 *  ---------------  56
 258 * |  OCT_NET_CMD  |
 259 *  ---------------  64
 260 * | Addtl 8-BData |
 261 * |               |
 262 *  ---------------
 263 */
 264
 265union octnet_cmd {
 266        u64 u64;
 267
 268        struct {
 269#ifdef __BIG_ENDIAN_BITFIELD
 270                u64 cmd:5;
 271
 272                u64 more:6; /* How many udd words follow the command */
 273
 274                u64 reserved:29;
 275
 276                u64 param1:16;
 277
 278                u64 param2:8;
 279
 280#else
 281
 282                u64 param2:8;
 283
 284                u64 param1:16;
 285
 286                u64 reserved:29;
 287
 288                u64 more:6;
 289
 290                u64 cmd:5;
 291
 292#endif
 293        } s;
 294
 295};
 296
 297#define   OCTNET_CMD_SIZE     (sizeof(union octnet_cmd))
 298
 299/* Instruction Header(DPI) - for OCTEON-III models */
 300struct  octeon_instr_ih3 {
 301#ifdef __BIG_ENDIAN_BITFIELD
 302
 303        /** Reserved3 */
 304        u64     reserved3:1;
 305
 306        /** Gather indicator 1=gather*/
 307        u64     gather:1;
 308
 309        /** Data length OR no. of entries in gather list */
 310        u64     dlengsz:14;
 311
 312        /** Front Data size */
 313        u64     fsz:6;
 314
 315        /** Reserved2 */
 316        u64     reserved2:4;
 317
 318        /** PKI port kind - PKIND */
 319        u64     pkind:6;
 320
 321        /** Reserved1 */
 322        u64     reserved1:32;
 323
 324#else
 325        /** Reserved1 */
 326        u64     reserved1:32;
 327
 328        /** PKI port kind - PKIND */
 329        u64     pkind:6;
 330
 331        /** Reserved2 */
 332        u64     reserved2:4;
 333
 334        /** Front Data size */
 335        u64     fsz:6;
 336
 337        /** Data length OR no. of entries in gather list */
 338        u64     dlengsz:14;
 339
 340        /** Gather indicator 1=gather*/
 341        u64     gather:1;
 342
 343        /** Reserved3 */
 344        u64     reserved3:1;
 345
 346#endif
 347};
 348
 349/* Optional PKI Instruction Header(PKI IH) - for OCTEON-III models */
 350/** BIG ENDIAN format.   */
 351struct  octeon_instr_pki_ih3 {
 352#ifdef __BIG_ENDIAN_BITFIELD
 353
 354        /** Wider bit */
 355        u64     w:1;
 356
 357        /** Raw mode indicator 1 = RAW */
 358        u64     raw:1;
 359
 360        /** Use Tag */
 361        u64     utag:1;
 362
 363        /** Use QPG */
 364        u64     uqpg:1;
 365
 366        /** Reserved2 */
 367        u64     reserved2:1;
 368
 369        /** Parse Mode */
 370        u64     pm:3;
 371
 372        /** Skip Length */
 373        u64     sl:8;
 374
 375        /** Use Tag Type */
 376        u64     utt:1;
 377
 378        /** Tag type */
 379        u64     tagtype:2;
 380
 381        /** Reserved1 */
 382        u64     reserved1:2;
 383
 384        /** QPG Value */
 385        u64     qpg:11;
 386
 387        /** Tag Value */
 388        u64     tag:32;
 389
 390#else
 391
 392        /** Tag Value */
 393        u64     tag:32;
 394
 395        /** QPG Value */
 396        u64     qpg:11;
 397
 398        /** Reserved1 */
 399        u64     reserved1:2;
 400
 401        /** Tag type */
 402        u64     tagtype:2;
 403
 404        /** Use Tag Type */
 405        u64     utt:1;
 406
 407        /** Skip Length */
 408        u64     sl:8;
 409
 410        /** Parse Mode */
 411        u64     pm:3;
 412
 413        /** Reserved2 */
 414        u64     reserved2:1;
 415
 416        /** Use QPG */
 417        u64     uqpg:1;
 418
 419        /** Use Tag */
 420        u64     utag:1;
 421
 422        /** Raw mode indicator 1 = RAW */
 423        u64     raw:1;
 424
 425        /** Wider bit */
 426        u64     w:1;
 427#endif
 428
 429};
 430
 431/** Instruction Header */
 432struct octeon_instr_ih2 {
 433#ifdef __BIG_ENDIAN_BITFIELD
 434        /** Raw mode indicator 1 = RAW */
 435        u64 raw:1;
 436
 437        /** Gather indicator 1=gather*/
 438        u64 gather:1;
 439
 440        /** Data length OR no. of entries in gather list */
 441        u64 dlengsz:14;
 442
 443        /** Front Data size */
 444        u64 fsz:6;
 445
 446        /** Packet Order / Work Unit selection (1 of 8)*/
 447        u64 qos:3;
 448
 449        /** Core group selection (1 of 16) */
 450        u64 grp:4;
 451
 452        /** Short Raw Packet Indicator 1=short raw pkt */
 453        u64 rs:1;
 454
 455        /** Tag type */
 456        u64 tagtype:2;
 457
 458        /** Tag Value */
 459        u64 tag:32;
 460#else
 461        /** Tag Value */
 462        u64 tag:32;
 463
 464        /** Tag type */
 465        u64 tagtype:2;
 466
 467        /** Short Raw Packet Indicator 1=short raw pkt */
 468        u64 rs:1;
 469
 470        /** Core group selection (1 of 16) */
 471        u64 grp:4;
 472
 473        /** Packet Order / Work Unit selection (1 of 8)*/
 474        u64 qos:3;
 475
 476        /** Front Data size */
 477        u64 fsz:6;
 478
 479        /** Data length OR no. of entries in gather list */
 480        u64 dlengsz:14;
 481
 482        /** Gather indicator 1=gather*/
 483        u64 gather:1;
 484
 485        /** Raw mode indicator 1 = RAW */
 486        u64 raw:1;
 487#endif
 488};
 489
 490/** Input Request Header */
 491struct octeon_instr_irh {
 492#ifdef __BIG_ENDIAN_BITFIELD
 493        u64 opcode:4;
 494        u64 rflag:1;
 495        u64 subcode:7;
 496        u64 vlan:12;
 497        u64 priority:3;
 498        u64 reserved:5;
 499        u64 ossp:32;             /* opcode/subcode specific parameters */
 500#else
 501        u64 ossp:32;             /* opcode/subcode specific parameters */
 502        u64 reserved:5;
 503        u64 priority:3;
 504        u64 vlan:12;
 505        u64 subcode:7;
 506        u64 rflag:1;
 507        u64 opcode:4;
 508#endif
 509};
 510
 511/** Return Data Parameters */
 512struct octeon_instr_rdp {
 513#ifdef __BIG_ENDIAN_BITFIELD
 514        u64 reserved:49;
 515        u64 pcie_port:3;
 516        u64 rlen:12;
 517#else
 518        u64 rlen:12;
 519        u64 pcie_port:3;
 520        u64 reserved:49;
 521#endif
 522};
 523
 524/** Receive Header */
 525union octeon_rh {
 526#ifdef __BIG_ENDIAN_BITFIELD
 527        u64 u64;
 528        struct {
 529                u64 opcode:4;
 530                u64 subcode:8;
 531                u64 len:3;     /** additional 64-bit words */
 532                u64 reserved:17;
 533                u64 ossp:32;   /** opcode/subcode specific parameters */
 534        } r;
 535        struct {
 536                u64 opcode:4;
 537                u64 subcode:8;
 538                u64 len:3;     /** additional 64-bit words */
 539                u64 extra:28;
 540                u64 vlan:12;
 541                u64 priority:3;
 542                u64 csum_verified:3;     /** checksum verified. */
 543                u64 has_hwtstamp:1;      /** Has hardware timestamp. 1 = yes. */
 544                u64 encap_on:1;
 545                u64 has_hash:1;          /** Has hash (rth or rss). 1 = yes. */
 546        } r_dh;
 547        struct {
 548                u64 opcode:4;
 549                u64 subcode:8;
 550                u64 len:3;     /** additional 64-bit words */
 551                u64 reserved:11;
 552                u64 num_gmx_ports:8;
 553                u64 max_nic_ports:10;
 554                u64 app_cap_flags:4;
 555                u64 app_mode:8;
 556                u64 pkind:8;
 557        } r_core_drv_init;
 558        struct {
 559                u64 opcode:4;
 560                u64 subcode:8;
 561                u64 len:3;       /** additional 64-bit words */
 562                u64 reserved:8;
 563                u64 extra:25;
 564                u64 gmxport:16;
 565        } r_nic_info;
 566#else
 567        u64 u64;
 568        struct {
 569                u64 ossp:32;  /** opcode/subcode specific parameters */
 570                u64 reserved:17;
 571                u64 len:3;    /** additional 64-bit words */
 572                u64 subcode:8;
 573                u64 opcode:4;
 574        } r;
 575        struct {
 576                u64 has_hash:1;          /** Has hash (rth or rss). 1 = yes. */
 577                u64 encap_on:1;
 578                u64 has_hwtstamp:1;      /** 1 = has hwtstamp */
 579                u64 csum_verified:3;     /** checksum verified. */
 580                u64 priority:3;
 581                u64 vlan:12;
 582                u64 extra:28;
 583                u64 len:3;    /** additional 64-bit words */
 584                u64 subcode:8;
 585                u64 opcode:4;
 586        } r_dh;
 587        struct {
 588                u64 pkind:8;
 589                u64 app_mode:8;
 590                u64 app_cap_flags:4;
 591                u64 max_nic_ports:10;
 592                u64 num_gmx_ports:8;
 593                u64 reserved:11;
 594                u64 len:3;       /** additional 64-bit words */
 595                u64 subcode:8;
 596                u64 opcode:4;
 597        } r_core_drv_init;
 598        struct {
 599                u64 gmxport:16;
 600                u64 extra:25;
 601                u64 reserved:8;
 602                u64 len:3;       /** additional 64-bit words */
 603                u64 subcode:8;
 604                u64 opcode:4;
 605        } r_nic_info;
 606#endif
 607};
 608
 609#define  OCT_RH_SIZE   (sizeof(union  octeon_rh))
 610
 611union octnic_packet_params {
 612        u32 u32;
 613        struct {
 614#ifdef __BIG_ENDIAN_BITFIELD
 615                u32 reserved:24;
 616                u32 ip_csum:1;          /* Perform IP header checksum(s) */
 617                /* Perform Outer transport header checksum */
 618                u32 transport_csum:1;
 619                /* Find tunnel, and perform transport csum. */
 620                u32 tnl_csum:1;
 621                u32 tsflag:1;           /* Timestamp this packet */
 622                u32 ipsec_ops:4;        /* IPsec operation */
 623#else
 624                u32 ipsec_ops:4;
 625                u32 tsflag:1;
 626                u32 tnl_csum:1;
 627                u32 transport_csum:1;
 628                u32 ip_csum:1;
 629                u32 reserved:24;
 630#endif
 631        } s;
 632};
 633
 634/** Status of a RGMII Link on Octeon as seen by core driver. */
 635union oct_link_status {
 636        u64 u64;
 637
 638        struct {
 639#ifdef __BIG_ENDIAN_BITFIELD
 640                u64 duplex:8;
 641                u64 mtu:16;
 642                u64 speed:16;
 643                u64 link_up:1;
 644                u64 autoneg:1;
 645                u64 if_mode:5;
 646                u64 pause:1;
 647                u64 flashing:1;
 648                u64 reserved:15;
 649#else
 650                u64 reserved:15;
 651                u64 flashing:1;
 652                u64 pause:1;
 653                u64 if_mode:5;
 654                u64 autoneg:1;
 655                u64 link_up:1;
 656                u64 speed:16;
 657                u64 mtu:16;
 658                u64 duplex:8;
 659#endif
 660        } s;
 661};
 662
 663/** The txpciq info passed to host from the firmware */
 664
 665union oct_txpciq {
 666        u64 u64;
 667
 668        struct {
 669#ifdef __BIG_ENDIAN_BITFIELD
 670                u64 q_no:8;
 671                u64 port:8;
 672                u64 pkind:6;
 673                u64 use_qpg:1;
 674                u64 qpg:11;
 675                u64 reserved:30;
 676#else
 677                u64 reserved:30;
 678                u64 qpg:11;
 679                u64 use_qpg:1;
 680                u64 pkind:6;
 681                u64 port:8;
 682                u64 q_no:8;
 683#endif
 684        } s;
 685};
 686
 687/** The rxpciq info passed to host from the firmware */
 688
 689union oct_rxpciq {
 690        u64 u64;
 691
 692        struct {
 693#ifdef __BIG_ENDIAN_BITFIELD
 694                u64 q_no:8;
 695                u64 reserved:56;
 696#else
 697                u64 reserved:56;
 698                u64 q_no:8;
 699#endif
 700        } s;
 701};
 702
 703/** Information for a OCTEON ethernet interface shared between core & host. */
 704struct oct_link_info {
 705        union oct_link_status link;
 706        u64 hw_addr;
 707
 708#ifdef __BIG_ENDIAN_BITFIELD
 709        u64 gmxport:16;
 710        u64 rsvd:32;
 711        u64 num_txpciq:8;
 712        u64 num_rxpciq:8;
 713#else
 714        u64 num_rxpciq:8;
 715        u64 num_txpciq:8;
 716        u64 rsvd:32;
 717        u64 gmxport:16;
 718#endif
 719
 720        union oct_txpciq txpciq[MAX_IOQS_PER_NICIF];
 721        union oct_rxpciq rxpciq[MAX_IOQS_PER_NICIF];
 722};
 723
 724#define OCT_LINK_INFO_SIZE   (sizeof(struct oct_link_info))
 725
 726struct liquidio_if_cfg_info {
 727        u64 iqmask; /** mask for IQs enabled for  the port */
 728        u64 oqmask; /** mask for OQs enabled for the port */
 729        struct oct_link_info linfo; /** initial link information */
 730        char   liquidio_firmware_version[32];
 731};
 732
 733/** Stats for each NIC port in RX direction. */
 734struct nic_rx_stats {
 735        /* link-level stats */
 736        u64 total_rcvd;
 737        u64 bytes_rcvd;
 738        u64 total_bcst;
 739        u64 total_mcst;
 740        u64 runts;
 741        u64 ctl_rcvd;
 742        u64 fifo_err;      /* Accounts for over/under-run of buffers */
 743        u64 dmac_drop;
 744        u64 fcs_err;
 745        u64 jabber_err;
 746        u64 l2_err;
 747        u64 frame_err;
 748
 749        /* firmware stats */
 750        u64 fw_total_rcvd;
 751        u64 fw_total_fwd;
 752        u64 fw_err_pko;
 753        u64 fw_err_link;
 754        u64 fw_err_drop;
 755        u64 fw_rx_vxlan;
 756        u64 fw_rx_vxlan_err;
 757
 758        /* LRO */
 759        u64 fw_lro_pkts;   /* Number of packets that are LROed      */
 760        u64 fw_lro_octs;   /* Number of octets that are LROed       */
 761        u64 fw_total_lro;  /* Number of LRO packets formed          */
 762        u64 fw_lro_aborts; /* Number of times lRO of packet aborted */
 763        u64 fw_lro_aborts_port;
 764        u64 fw_lro_aborts_seq;
 765        u64 fw_lro_aborts_tsval;
 766        u64 fw_lro_aborts_timer;
 767        /* intrmod: packet forward rate */
 768        u64 fwd_rate;
 769};
 770
 771/** Stats for each NIC port in RX direction. */
 772struct nic_tx_stats {
 773        /* link-level stats */
 774        u64 total_pkts_sent;
 775        u64 total_bytes_sent;
 776        u64 mcast_pkts_sent;
 777        u64 bcast_pkts_sent;
 778        u64 ctl_sent;
 779        u64 one_collision_sent;   /* Packets sent after one collision*/
 780        u64 multi_collision_sent; /* Packets sent after multiple collision*/
 781        u64 max_collision_fail;   /* Packets not sent due to max collisions */
 782        u64 max_deferral_fail;   /* Packets not sent due to max deferrals */
 783        u64 fifo_err;       /* Accounts for over/under-run of buffers */
 784        u64 runts;
 785        u64 total_collisions; /* Total number of collisions detected */
 786
 787        /* firmware stats */
 788        u64 fw_total_sent;
 789        u64 fw_total_fwd;
 790        u64 fw_total_fwd_bytes;
 791        u64 fw_err_pko;
 792        u64 fw_err_link;
 793        u64 fw_err_drop;
 794        u64 fw_err_tso;
 795        u64 fw_tso;             /* number of tso requests */
 796        u64 fw_tso_fwd;         /* number of packets segmented in tso */
 797        u64 fw_tx_vxlan;
 798};
 799
 800struct oct_link_stats {
 801        struct nic_rx_stats fromwire;
 802        struct nic_tx_stats fromhost;
 803
 804};
 805
 806#define LIO68XX_LED_CTRL_ADDR     0x3501
 807#define LIO68XX_LED_CTRL_CFGON    0x1f
 808#define LIO68XX_LED_CTRL_CFGOFF   0x100
 809#define LIO68XX_LED_BEACON_ADDR   0x3508
 810#define LIO68XX_LED_BEACON_CFGON  0x47fd
 811#define LIO68XX_LED_BEACON_CFGOFF 0x11fc
 812#define VITESSE_PHY_GPIO_DRIVEON  0x1
 813#define VITESSE_PHY_GPIO_CFG      0x8
 814#define VITESSE_PHY_GPIO_DRIVEOFF 0x4
 815#define VITESSE_PHY_GPIO_HIGH     0x2
 816#define VITESSE_PHY_GPIO_LOW      0x3
 817
 818struct oct_mdio_cmd {
 819        u64 op;
 820        u64 mdio_addr;
 821        u64 value1;
 822        u64 value2;
 823        u64 value3;
 824};
 825
 826#define OCT_LINK_STATS_SIZE   (sizeof(struct oct_link_stats))
 827
 828/* intrmod: max. packet rate threshold */
 829#define LIO_INTRMOD_MAXPKT_RATETHR      196608
 830/* intrmod: min. packet rate threshold */
 831#define LIO_INTRMOD_MINPKT_RATETHR      9216
 832/* intrmod: max. packets to trigger interrupt */
 833#define LIO_INTRMOD_RXMAXCNT_TRIGGER    384
 834/* intrmod: min. packets to trigger interrupt */
 835#define LIO_INTRMOD_RXMINCNT_TRIGGER    1
 836/* intrmod: max. time to trigger interrupt */
 837#define LIO_INTRMOD_RXMAXTMR_TRIGGER    128
 838/* 66xx:intrmod: min. time to trigger interrupt
 839 * (value of 1 is optimum for TCP_RR)
 840 */
 841#define LIO_INTRMOD_RXMINTMR_TRIGGER    1
 842
 843/* intrmod: max. packets to trigger interrupt */
 844#define LIO_INTRMOD_TXMAXCNT_TRIGGER    64
 845/* intrmod: min. packets to trigger interrupt */
 846#define LIO_INTRMOD_TXMINCNT_TRIGGER    0
 847
 848/* intrmod: poll interval in seconds */
 849#define LIO_INTRMOD_CHECK_INTERVAL  1
 850
 851struct oct_intrmod_cfg {
 852        u64 rx_enable;
 853        u64 tx_enable;
 854        u64 check_intrvl;
 855        u64 maxpkt_ratethr;
 856        u64 minpkt_ratethr;
 857        u64 rx_maxcnt_trigger;
 858        u64 rx_mincnt_trigger;
 859        u64 rx_maxtmr_trigger;
 860        u64 rx_mintmr_trigger;
 861        u64 tx_mincnt_trigger;
 862        u64 tx_maxcnt_trigger;
 863        u64 rx_frames;
 864        u64 tx_frames;
 865        u64 rx_usecs;
 866};
 867
 868#define BASE_QUEUE_NOT_REQUESTED 65535
 869
 870union oct_nic_if_cfg {
 871        u64 u64;
 872        struct {
 873#ifdef __BIG_ENDIAN_BITFIELD
 874                u64 base_queue:16;
 875                u64 num_iqueues:16;
 876                u64 num_oqueues:16;
 877                u64 gmx_port_id:8;
 878                u64 vf_id:8;
 879#else
 880                u64 vf_id:8;
 881                u64 gmx_port_id:8;
 882                u64 num_oqueues:16;
 883                u64 num_iqueues:16;
 884                u64 base_queue:16;
 885#endif
 886        } s;
 887};
 888
 889#endif
 890